From 40d127206b3ffbb93ff3c172e39c0b4f7ac4458f Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Fri, 20 Sep 2019 16:16:40 +0200 Subject: [PATCH 01/55] Actually change blink_saccade_edge_discard_factor to 0 --- src/pspm_get_eyelink.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/pspm_get_eyelink.m b/src/pspm_get_eyelink.m index c2406d398..02597621d 100644 --- a/src/pspm_get_eyelink.m +++ b/src/pspm_get_eyelink.m @@ -67,9 +67,10 @@ % add specific import path for specific import function addpath([settings.path, 'Import', filesep, 'eyelink']); + default_blink_saccade_discard_factor = 0; for i = 1:numel(import) if ~isfield(import{i}, 'blink_saccade_edge_discard_factor') - import{i}.blink_saccade_edge_discard_factor = 0.05; + import{i}.blink_saccade_edge_discard_factor = default_blink_saccade_discard_factor; end if ~isnumeric(import{i}.blink_saccade_edge_discard_factor) || ... @@ -102,11 +103,17 @@ else mask_chans = {'blink_l', 'blink_r', 'saccade_l', 'saccade_r'}; end + expand_factor = 0; + if i <= numel(import) + expand_factor = import{i}.blink_saccade_edge_discard_factor; + else + expand_factor = default_blink_saccade_discard_factor; + end data{i}.channels = expand_mask_chans(... data{i}.channels, ... data{i}.channels_header, ... mask_chans, ... - import{i}.blink_saccade_edge_discard_factor * data{i}.sampleRate ... + expand_factor * data{i}.sampleRate ... ); data{i}.channels = set_blinks_saccades_to_nan(data{i}.channels, data{i}.channels_header, mask_chans, @(x) endsWith(x, '_l')); end From 0d75d2ce44e91dae0cf01c4b36348601da660add Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Fri, 20 Sep 2019 16:20:02 +0200 Subject: [PATCH 02/55] Change import_eyelink output structure Markers in existing session cells that come after the END message are not returned in the cells anymore since pspm_get_eyelink later combines all markers using interpolation; previously, there were more markers than the numbers in the file when some of the markers appeared in between two sessions. --- src/Import/eyelink/import_eyelink.m | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Import/eyelink/import_eyelink.m b/src/Import/eyelink/import_eyelink.m index 6d623cc9d..f04e46ea3 100644 --- a/src/Import/eyelink/import_eyelink.m +++ b/src/Import/eyelink/import_eyelink.m @@ -76,6 +76,41 @@ data{sn}.markerinfos.value = markers_sess{sn}.vals; end data{end + 1} = combine_markers(markers_sess); + + session_end_times = calc_session_end_times(messages); + for i = 1:numel(data) - 1 + [data{i}.markers, data{i}.markerinfos] = remove_markers_beyond_end(... + data{i}.markers, data{i}.markerinfos, markers_sess{i}.times, session_end_times{i}); + end +end + +function [markers_out, markerinfos_out] = remove_markers_beyond_end(markers, markerinfos, markertimes, sess_end_time) + mask = markertimes <= sess_end_time; + + marker_indices = find(markers); + markers_out = markers; + if any(~mask) + markers_out(marker_indices(end)) = 0; + end + + markerinfos_out = markerinfos; + markerinfos_out.name = markerinfos_out.name(mask); + markerinfos_out.value = markerinfos_out.value(mask); +end + +function session_end_times = calc_session_end_times(session_messages) + out = {}; + for i = 1:numel(session_messages) + for j = 1:numel(session_messages{i}) + msg = session_messages{i}{j}; + if strcmp(msg(1:3), 'END') + parts = strsplit(msg); + out{end + 1} = str2num(parts{2}); + break + end + end + end + session_end_times = out; end function [dataraw, messages, chan_info, file_info] = parse_eyelink_file(filepath) From 786246dce56f8ecc9954ebdd9195a0ce4cb7046b Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Tue, 24 Sep 2019 08:09:00 +0200 Subject: [PATCH 03/55] Remove output channel length test from ecg2hb_amri test With 4d0cf4d pspm_ecg2hb_amri only returns heartbeat seconds and not a logic vector of the same length as the input. Hence, this test is not valid anymore. --- test/pspm_ecg2hb_amri_test.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/pspm_ecg2hb_amri_test.m b/test/pspm_ecg2hb_amri_test.m index 08d477633..28820d5a7 100644 --- a/test/pspm_ecg2hb_amri_test.m +++ b/test/pspm_ecg2hb_amri_test.m @@ -23,9 +23,6 @@ function check_if_heartbeat_channel_is_saved(this) load(this.input_filename); this.verifyEqual(data{out_channel}.header.chantype, 'hb'); - - ecg_chan_indices = find(cell2mat(cellfun(@(x) strcmp(x.header.chantype, 'ecg'), data, 'uni', false))); - this.verifyEqual(numel(data{ecg_chan_indices(end)}.data), numel(data{out_channel}.data)); end end From b8f8fa0ac45701ae856de378c581db7c33f10543 Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Tue, 24 Sep 2019 08:50:10 +0200 Subject: [PATCH 04/55] Return exit code from pspm_test for jenkins --- test/pspm_test.m | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/pspm_test.m b/test/pspm_test.m index 2665c5c64..b6e4d8bcb 100644 --- a/test/pspm_test.m +++ b/test/pspm_test.m @@ -76,7 +76,8 @@ TestSuite.fromClass(?pspm_get_resp_test), ... TestSuite.fromClass(?pspm_get_scr_test)]; -full_suite = [suite, import_suite, chantype_suite]; +%full_suite = [suite, import_suite, chantype_suite]; +full_suite = [chantype_suite]; % run tests % ------------------------------------------------------------------------- @@ -84,3 +85,7 @@ addpath(pth); pspm_init; stats = run(full_suite) +n_failed = sum([stats.Failed]); +success = n_failed == 0; +exit_code = 1 - success; +quit(exit_code); From 0b1973ed9b150111d2cae9ccc2225993da9c11a7 Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Tue, 24 Sep 2019 09:21:45 +0200 Subject: [PATCH 05/55] Improve pspm_test logging output --- test/pspm_test.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/pspm_test.m b/test/pspm_test.m index b6e4d8bcb..d41746738 100644 --- a/test/pspm_test.m +++ b/test/pspm_test.m @@ -87,5 +87,12 @@ stats = run(full_suite) n_failed = sum([stats.Failed]); success = n_failed == 0; + +if success + display('pspm_test: All tests have passed!'); +else + display('pspm_test: Some tests have failed!'); +end + exit_code = 1 - success; quit(exit_code); From 34c8bb388ee23833dcb4892e27b2d443b519c9a2 Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Mon, 30 Sep 2019 09:40:09 +0200 Subject: [PATCH 06/55] Disable data filtering in pspm_display and pspm_ecg_editor --- src/pspm_display.m | 11 ----------- src/pspm_ecg_editor.m | 23 ++--------------------- 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/src/pspm_display.m b/src/pspm_display.m index b5f51bea6..be44afb2c 100644 --- a/src/pspm_display.m +++ b/src/pspm_display.m @@ -687,17 +687,6 @@ function ed_y_max_CreateFcn(hObject, eventdata, handles) switch handles.prop.wave case 'ecg' - filt.sr=sr.wave; - filt.lpfreq=15; - filt.lporder=1; - filt.hpfreq=5; - filt.hporder=1; - filt.direction='uni'; - filt.down='none'; - % filter ecg in order to display it without artifacts - [sts,wave,foo]=pspm_prepdata(wave,filt); - if sts == -1, fprintf('Displaying unfiltered data.\n'); end; - case 'hr' case 'hp' case 'scr' diff --git a/src/pspm_ecg_editor.m b/src/pspm_ecg_editor.m index e58a487a0..2014b45b2 100644 --- a/src/pspm_ecg_editor.m +++ b/src/pspm_ecg_editor.m @@ -102,16 +102,6 @@ function pspm_ecg_editor_OpeningFcn(hObject, eventdata, handles, varargin) handles.winsize=4; % winsize for the manual mode handles.zoom_factor = 1; handles.data = {}; -% define filter properties (copied from pspm_ecg2hb) -handles.filt = struct(); -handles.filt.sr=0; % to be set -handles.filt.lpfreq=15; -handles.filt.lporder=1; -handles.filt.hpfreq=5; -handles.filt.hporder=1; -handles.filt.direction='uni'; - -handles.filt.down=200; % plot settings handles.plot.factr = 1; handles.plot.limits.upper = 120; @@ -418,7 +408,6 @@ function load_settings(hObject,handles, varargin) ecg=handles.data.data.x(:,1)'; handles.plot.sr = sr; - handles.filt.sr = sr; handles.plot.ecg = ecg; end; @@ -908,15 +897,8 @@ function load_data_file(hObject, handles, fn) set(handles.edtDataFile, 'String', fn); % filter data - data = handles.data{handles.data_chan}; - sr = data.header.sr; - handles.filt.sr = sr; - % filter data - [nsts,ecg,sr]=pspm_prepdata(data.data, handles.filt); - if nsts == -1 - warning('Could not filter data, will use unfiltered data.'); - ecg = data.data; - end; + ecg = handles.data{handles.data_chan}.data; + sr = handles.data{handles.data_chan}.header.sr; handles.plot.ecg = ecg; handles.e = 0; @@ -925,7 +907,6 @@ function load_data_file(hObject, handles, fn) handles.plot.p = -1; end; handles.plot.sr = sr; - handles.filt.sr = sr; guidata(hObject, handles); end; From f1930f0c13254804282b0706447a5808d91ec44b Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Tue, 24 Sep 2019 11:07:06 +0200 Subject: [PATCH 07/55] Print markdown test diagnostics in pspm_test --- test/format_test_results.m | 43 ++++++++ test/pspm_get_ecg_test.m | 4 +- test/pspm_test.m | 197 ++++++++++++++++++++----------------- 3 files changed, 152 insertions(+), 92 deletions(-) create mode 100644 test/format_test_results.m diff --git a/test/format_test_results.m b/test/format_test_results.m new file mode 100644 index 000000000..187e5e6c7 --- /dev/null +++ b/test/format_test_results.m @@ -0,0 +1,43 @@ +function str = format_test_results(stats) + durations = [stats.Duration]; + names = {stats.Name}; + success_mask = [stats.Passed]; + fail_mask = [stats.Failed]; + incomplete_mask = [stats.Incomplete]; + details = {stats.Details}; + + total_test_time = sum(durations); + + str = sprintf('### Jenkins Build Statistics\n'); + str = [str sprintf('* Total testing time: %.2f sec\n', total_test_time)]; + str = [str sprintf('* Number of passed checks: %d\n', sum(success_mask))]; + str = [str sprintf('* Number of failed checks: %d\n', sum(fail_mask))]; + str = [str sprintf('* Number of incomplete checks: %d\n', sum(incomplete_mask))]; + str = [str sprintf('\n')]; + str = [str sprintf('#### Table of Failed Checks\n')]; + str = [str format_md_table(fail_mask, details, names, durations)]; + str = [str sprintf('\n')]; + str = [str sprintf('#### Table of Incomplete Checks\n')]; + str = [str format_md_table(incomplete_mask, details, names, durations)]; +end + +function str = format_md_table(mask, details, names, durations) + str = sprintf('| Test name | File | Line number | Duration |\n'); + str = [str sprintf('| --- | --- | --- | --- |\n')]; + indices = find(mask); + for i = 1:numel(indices) + idx = indices(i); + report_elems = split(details{idx}.DiagnosticRecord.Report); + filepath = report_elems{end - 3}; + parts = {}; + if ~isempty(strfind(filepath, '/')) + parts = split(filepath, '/'); + else + parts = split(filepath, '\'); + end + filename = parts{end}; + linenum = str2num(report_elems{end}); + str = [str sprintf('| %s | %s | %d | %.2f |\n', names{idx}, filename, linenum, durations(idx))]; + end + +end diff --git a/test/pspm_get_ecg_test.m b/test/pspm_get_ecg_test.m index db34926c0..0ffc6845c 100644 --- a/test/pspm_get_ecg_test.m +++ b/test/pspm_get_ecg_test.m @@ -3,7 +3,7 @@ % unittest class for the pspm_get_ecg function %__________________________________________________________________________ % SCRalyze TestEnvironment -% (C) 2013 Linus Rόttimann (University of Zurich) +% (C) 2013 Linus RοΏ½ttimann (University of Zurich) methods (Test) function test(this) @@ -22,4 +22,4 @@ function test(this) end end -end \ No newline at end of file +end diff --git a/test/pspm_test.m b/test/pspm_test.m index d41746738..abbe67869 100644 --- a/test/pspm_test.m +++ b/test/pspm_test.m @@ -1,98 +1,115 @@ -%% pspm_test is a wrapper script for testing all testable functions in one -% - to be used before any release. -% This is under construction. +function pspm_test(varargin) + %% pspm_test is a wrapper script for testing all testable functions in one + % - to be used before any release. + % + % quit_after_tests : [bool] + % Define whether the script should quit MATLAB with a success/fail flag + % after the tests are run. + % (Default: false) -%__________________________________________________________________________ -% PsPM TestEnvironment -% (C) 2013 Dominik Bach & Linus Ruettimann (University of Zurich) + %__________________________________________________________________________ + % PsPM TestEnvironment + % (C) 2013 Dominik Bach & Linus Ruettimann (University of Zurich) -% imports -% ------------------------------------------------------------------------- -import matlab.unittest.TestSuite; + % imports + % ------------------------------------------------------------------------- + import matlab.unittest.TestSuite; -% build suits -% ------------------------------------------------------------------------- -suite = [ TestSuite.fromClass(?pspm_load_data_test), ... - TestSuite.fromClass(?pspm_write_channel_test), ... - TestSuite.fromClass(?pspm_trim_test), ... - TestSuite.fromClass(?pspm_find_channel_test), ... - TestSuite.fromClass(?pspm_get_timing_test), ... - TestSuite.fromClass(?pspm_import_test), ... - TestSuite.fromClass(?pspm_prepdata_test), ... - TestSuite.fromClass(?pspm_pp_test), ... - TestSuite.fromClass(?pspm_pulse_convert_test),... - TestSuite.fromClass(?pspm_ren_test), ... - TestSuite.fromClass(?pspm_split_sessions_test), ... - TestSuite.fromClass(?pspm_load1_test), ... - TestSuite.fromClass(?pspm_glm_test), ... - TestSuite.fromClass(?pspm_find_sounds_test), ... - TestSuite.fromClass(?pspm_bf_test), ... - TestSuite.fromClass(?pspm_interpolate_test), ... - TestSuite.fromClass(?pspm_find_valid_fixations_test), ... - TestSuite.fromClass(?pspm_extract_segments_test), ... - TestSuite.fromClass(?pspm_process_illuminance_test), ... - TestSuite.fromClass(?pspm_ecg2hb_test), ... - TestSuite.fromClass(?pspm_convert_unit_test), ... - TestSuite.fromClass(?pspm_align_channels_test), ... - TestSuite.fromClass(?pspm_resp_pp_test), ... - TestSuite.fromClass(?pspm_ecg2hb_amri_test), ... - TestSuite.fromClass(?pspm_path_test), ... - TestSuite.fromClass(?pspm_pupil_correct_eyelink_test), ... - TestSuite.fromClass(?pspm_pupil_correct_test), ... - TestSuite.fromClass(?pspm_pupil_pp_test), ... - TestSuite.fromClass(?set_blinks_saccades_to_nan_test)]; - + quit_after_tests = false; + if nargin > 0 + quit_after_tests = varargin{1}; + assert(islogical(quit_after_tests)); + end -import_suite = [ TestSuite.fromClass(?pspm_get_acq_test), ... - TestSuite.fromClass(?pspm_get_acqmat_test), ... - TestSuite.fromClass(?pspm_get_acq_bioread_test), ... - TestSuite.fromClass(?pspm_get_biograph_test), ... - TestSuite.fromClass(?pspm_get_biosemi_test), ... - TestSuite.fromClass(?pspm_get_biotrace_test), ... - TestSuite.fromClass(?pspm_get_brainvis_test), ... - TestSuite.fromClass(?pspm_get_eyelink_test), ... - TestSuite.fromClass(?pspm_get_labchartmat_ext_test), ... - TestSuite.fromClass(?pspm_get_labchartmat_in_test), ... - TestSuite.fromClass(?pspm_get_mat_test), ... - TestSuite.fromClass(?pspm_get_obs_test), ... - TestSuite.fromClass(?pspm_get_physlog_test), ... - TestSuite.fromClass(?pspm_get_spike_test), ... - TestSuite.fromClass(?pspm_get_txt_test), ... - TestSuite.fromClass(?pspm_get_vario_test), ... - TestSuite.fromClass(?pspm_get_edf_test), ... - TestSuite.fromClass(?pspm_get_wdq_n_test), ... - TestSuite.fromClass(?pspm_get_viewpoint_test), ... - TestSuite.fromClass(?pspm_get_smi_test), ... - TestSuite.fromClass(?import_eyelink_test), ... - TestSuite.fromClass(?import_viewpoint_test), ... - TestSuite.fromClass(?import_smi_test)]; - -chantype_suite = [ TestSuite.fromClass(?pspm_get_ecg_test), ... - TestSuite.fromClass(?pspm_get_events_test), ... - TestSuite.fromClass(?pspm_get_hb_test), ... - TestSuite.fromClass(?pspm_get_hr_test), ... - TestSuite.fromClass(?pspm_get_marker_test), ... - TestSuite.fromClass(?pspm_get_pupil_test), ... - TestSuite.fromClass(?pspm_get_resp_test), ... - TestSuite.fromClass(?pspm_get_scr_test)]; + % build suits + % ------------------------------------------------------------------------- + suite = [ TestSuite.fromClass(?pspm_load_data_test), ... + TestSuite.fromClass(?pspm_write_channel_test), ... + TestSuite.fromClass(?pspm_trim_test), ... + TestSuite.fromClass(?pspm_find_channel_test), ... + TestSuite.fromClass(?pspm_get_timing_test), ... + TestSuite.fromClass(?pspm_import_test), ... + TestSuite.fromClass(?pspm_prepdata_test), ... + TestSuite.fromClass(?pspm_pp_test), ... + TestSuite.fromClass(?pspm_pulse_convert_test),... + TestSuite.fromClass(?pspm_ren_test), ... + TestSuite.fromClass(?pspm_split_sessions_test), ... + TestSuite.fromClass(?pspm_load1_test), ... + TestSuite.fromClass(?pspm_glm_test), ... + TestSuite.fromClass(?pspm_find_sounds_test), ... + TestSuite.fromClass(?pspm_bf_test), ... + TestSuite.fromClass(?pspm_interpolate_test), ... + TestSuite.fromClass(?pspm_find_valid_fixations_test), ... + TestSuite.fromClass(?pspm_extract_segments_test), ... + TestSuite.fromClass(?pspm_process_illuminance_test), ... + TestSuite.fromClass(?pspm_ecg2hb_test), ... + TestSuite.fromClass(?pspm_convert_unit_test), ... + TestSuite.fromClass(?pspm_align_channels_test), ... + TestSuite.fromClass(?pspm_resp_pp_test), ... + TestSuite.fromClass(?pspm_ecg2hb_amri_test), ... + TestSuite.fromClass(?pspm_path_test), ... + TestSuite.fromClass(?pspm_pupil_correct_eyelink_test), ... + TestSuite.fromClass(?pspm_pupil_correct_test), ... + TestSuite.fromClass(?pspm_pupil_pp_test), ... + TestSuite.fromClass(?set_blinks_saccades_to_nan_test)]; -%full_suite = [suite, import_suite, chantype_suite]; -full_suite = [chantype_suite]; -% run tests -% ------------------------------------------------------------------------- -[pth, fn, ext] = fileparts(which('pspm_test.m')); -addpath(pth); -pspm_init; -stats = run(full_suite) -n_failed = sum([stats.Failed]); -success = n_failed == 0; + import_suite = [ TestSuite.fromClass(?pspm_get_acq_test), ... + TestSuite.fromClass(?pspm_get_acqmat_test), ... + TestSuite.fromClass(?pspm_get_acq_bioread_test), ... + TestSuite.fromClass(?pspm_get_biograph_test), ... + TestSuite.fromClass(?pspm_get_biosemi_test), ... + TestSuite.fromClass(?pspm_get_biotrace_test), ... + TestSuite.fromClass(?pspm_get_brainvis_test), ... + TestSuite.fromClass(?pspm_get_eyelink_test), ... + TestSuite.fromClass(?pspm_get_labchartmat_ext_test), ... + TestSuite.fromClass(?pspm_get_labchartmat_in_test), ... + TestSuite.fromClass(?pspm_get_mat_test), ... + TestSuite.fromClass(?pspm_get_obs_test), ... + TestSuite.fromClass(?pspm_get_physlog_test), ... + TestSuite.fromClass(?pspm_get_spike_test), ... + TestSuite.fromClass(?pspm_get_txt_test), ... + TestSuite.fromClass(?pspm_get_vario_test), ... + TestSuite.fromClass(?pspm_get_edf_test), ... + TestSuite.fromClass(?pspm_get_wdq_n_test), ... + TestSuite.fromClass(?pspm_get_viewpoint_test), ... + TestSuite.fromClass(?pspm_get_smi_test), ... + TestSuite.fromClass(?import_eyelink_test), ... + TestSuite.fromClass(?import_viewpoint_test), ... + TestSuite.fromClass(?import_smi_test)]; -if success - display('pspm_test: All tests have passed!'); -else - display('pspm_test: Some tests have failed!'); -end + chantype_suite = [ TestSuite.fromClass(?pspm_get_ecg_test), ... + TestSuite.fromClass(?pspm_get_events_test), ... + TestSuite.fromClass(?pspm_get_hb_test), ... + TestSuite.fromClass(?pspm_get_hr_test), ... + TestSuite.fromClass(?pspm_get_marker_test), ... + TestSuite.fromClass(?pspm_get_pupil_test), ... + TestSuite.fromClass(?pspm_get_resp_test), ... + TestSuite.fromClass(?pspm_get_scr_test)]; + + full_suite = [suite, import_suite, chantype_suite]; + + % run tests + % ------------------------------------------------------------------------- + [pth, fn, ext] = fileparts(which('pspm_test.m')); + addpath(pth); + pspm_init; + stats = run(full_suite) + n_failed = sum([stats.Failed]); + success = n_failed == 0; -exit_code = 1 - success; -quit(exit_code); + if success + display('pspm_test: All tests have passed!'); + else + display('pspm_test: Some tests have failed!'); + end + + display('===TEST_STATISTICS_BEGIN==='); + display(format_test_results(stats)); + display('===TEST_STATISTICS_END==='); + if quit_after_tests + exit_code = 1 - success; + quit(exit_code); + end + +end From bd0d13089d9d14f459dfa0e245b8b389156d94a8 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 7 Oct 2019 09:12:16 +0200 Subject: [PATCH 08/55] Issue 34 fixed --- src/pspm_prepdata.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pspm_prepdata.m b/src/pspm_prepdata.m index 71eadb60a..3afc53962 100644 --- a/src/pspm_prepdata.m +++ b/src/pspm_prepdata.m @@ -44,6 +44,9 @@ warning('ID:invalid_input', 'Nothing to do.'); return; elseif ~isnumeric(data) warning('ID:invalid_input', 'Data must be numeric.'); return; +elseif any(isnan(data)) + data = data(~isnan(data)); + warning('ID:invalid_input', 'Data contains NaN values. Function will ignore NaN.'); elseif (~isfield(filt, 'lpfreq') || ~isfield(filt, 'lporder') || ... ~isfield(filt, 'hpfreq') || ~isfield(filt, 'hporder') || ... ~isfield(filt, 'down') || ~isfield(filt, 'direction') || ... From e6bb87e9f75184e025df7af771bc5620705ddac7 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 7 Oct 2019 09:31:30 +0200 Subject: [PATCH 09/55] Put the check for NaNs before check_input --- src/pspm_prepdata.m | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pspm_prepdata.m b/src/pspm_prepdata.m index 3afc53962..7fea0c36c 100644 --- a/src/pspm_prepdata.m +++ b/src/pspm_prepdata.m @@ -10,8 +10,8 @@ % .sr - current sample rate in Hz % .lpfreq - low pass filt frequency or 'none' % .lporder - low pass filt order -% .hpfreq - high pass filt frequency or 'none' % .hporder - high pass filt order +% .hpfreq - high pass filt frequency or 'none' % .direction - filt direction % .down - sample rate in Hz after downsampling or 'none' % @@ -38,15 +38,19 @@ newsr = 0; outdata = data; +% check input for NaN values +% ------------------------------------------------------------------------- +if any(isnan(data)) + data = data(~isnan(data)); + warning('ID:invalid_input', 'Data contains NaN values. Function will ignore NaN.'); +end + % check input % ------------------------------------------------------------------------- if nargin < 2 warning('ID:invalid_input', 'Nothing to do.'); return; elseif ~isnumeric(data) warning('ID:invalid_input', 'Data must be numeric.'); return; -elseif any(isnan(data)) - data = data(~isnan(data)); - warning('ID:invalid_input', 'Data contains NaN values. Function will ignore NaN.'); elseif (~isfield(filt, 'lpfreq') || ~isfield(filt, 'lporder') || ... ~isfield(filt, 'hpfreq') || ~isfield(filt, 'hporder') || ... ~isfield(filt, 'down') || ~isfield(filt, 'direction') || ... From 30e52a9f0fab7c27968d28ffc33ae8124ebf3a6a Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 7 Oct 2019 09:50:42 +0200 Subject: [PATCH 10/55] Add a test line + Modified dev. guide --- doc/PsPM_Developers_Guide.lyx | 22 +- doc/PsPM_Developers_Guide.lyx~ | 25924 +++++++++++++++++++++++++++++++ test/pspm_prepdata_test.m | 3 +- 3 files changed, 25947 insertions(+), 2 deletions(-) create mode 100644 doc/PsPM_Developers_Guide.lyx~ diff --git a/doc/PsPM_Developers_Guide.lyx b/doc/PsPM_Developers_Guide.lyx index f58309d98..17d89e7dd 100644 --- a/doc/PsPM_Developers_Guide.lyx +++ b/doc/PsPM_Developers_Guide.lyx @@ -16533,7 +16533,7 @@ Tests: \begin_layout Standard \begin_inset Tabular - + @@ -16561,6 +16561,26 @@ Expected warning \begin_inset Text +\begin_layout Plain Layout +pspm_prepdata([1 NaN 3], filt) [NaN values in data] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + \begin_layout Plain Layout pspm_prepdata([1 2 3]) [no filt variable] \end_layout diff --git a/doc/PsPM_Developers_Guide.lyx~ b/doc/PsPM_Developers_Guide.lyx~ new file mode 100644 index 000000000..0506bf625 --- /dev/null +++ b/doc/PsPM_Developers_Guide.lyx~ @@ -0,0 +1,25924 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass article +\begin_preamble +\definecolor{colKeys}{rgb}{0,0,1} +\definecolor{colIdentifier}{rgb}{0,0,0} +\definecolor{colComments}{rgb}{0.53, 0.66, 0.42} +\definecolor{colString}{rgb}{0.87, 0.36, 0.51} +\definecolor{barColor}{rgb}{0.43, 0.5, 0.5} +% Added by lyx2lyx +\renewcommand{\textendash}{--} +\renewcommand{\textemdash}{---} +\end_preamble +\use_default_options true +\maintain_unincluded_children false +\language english +\language_package default +\inputencoding auto +\fontencoding global +\font_roman "default" "default" +\font_sans "default" "default" +\font_typewriter "default" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize default +\spacing single +\use_hyperref false +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\listings_params "language=Matlab,float=hbp,basicstyle={\footnotesize\ttfamily},identifierstyle={\color{colIdentifier}},keywordstyle={\color{colKeys}},stringstyle={\color{colString}},commentstyle={\itshape\color{colComments}},columns=fixed,tabsize=2,extendedchars=true,showspaces=false,showstringspaces=false,captionpos=t,backgroundcolor={\color{white}},framexleftmargin=1pt,frame=l" +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Title +PsPM: Psychophysiological Modelling +\end_layout + +\begin_layout Title +Developer's Guide +\end_layout + +\begin_layout Standard +\align center +Version 4.2.0 +\end_layout + +\begin_layout Standard +\begin_inset VSpace defskip +\end_inset + + +\end_layout + +\begin_layout Standard +\align center + +\size larger +by the PsPM team +\size default + +\begin_inset Foot +status open + +\begin_layout Plain Layout +\noindent +If you have comments on or error corrections to this documentation, please + send them to the PsPM team or post them on: +\begin_inset CommandInset href +LatexCommand href +name "pspm.sourceforge.net" +target "http://pspm.sourceforge.net" +literal "false" + +\end_inset + + +\end_layout + +\end_inset + + +\size larger +: +\end_layout + +\begin_layout Standard +\align center + +\size larger +Dominik R Bach, Giuseppe Castegnetti, Laure Ciernik, Samuel Gerster, Saurabh + Khemka, Christoph Korn, Tobias Moser, Philipp C Paulus, Matthias Staib, + Eshref Yozdemir and collaborators +\size default + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset toc +LatexCommand tableofcontents + +\end_inset + + +\begin_inset Newpage newpage +\end_inset + + +\end_layout + +\begin_layout Section +General +\end_layout + +\begin_layout Subsection +Data files: General structure +\end_layout + +\begin_layout Standard +In PsPM the data is saved in mat-files. + Each file contains two variables: +\end_layout + +\begin_layout Itemize + +\family typewriter +infos +\family default + A struct variable with general infos +\end_layout + +\begin_layout Itemize + +\family typewriter +data +\family default + A cell array with a cell for each channel. + +\end_layout + +\begin_layout Standard +The cells contain a struct with channel specific infos and data. + The structs have the mandatory fields: +\end_layout + +\begin_layout Itemize + +\family typewriter +infos.duration +\family default + (in seconds) +\end_layout + +\begin_layout Itemize + +\family typewriter +data{n}.header +\family default + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Itemize + +\family typewriter +data{n}.header.chantype +\family default + (as defined in the settings) +\end_layout + +\begin_layout Itemize + +\family typewriter +data{n}.header.sr +\family default + (sample rate in 1/second, or timestamp units in seconds) +\end_layout + +\begin_layout Itemize + +\family typewriter +data{n}.header.units +\family default + (data units, or β€˜events’) +\end_layout + +\begin_layout Itemize + +\family typewriter +data{n}.data +\family default + (actual data) +\end_layout + +\end_deeper +\begin_layout Standard +Additionally, a typical file contains the optional infos: +\end_layout + +\begin_layout Itemize + +\family typewriter +infos.sourcefile +\end_layout + +\begin_layout Itemize + +\family typewriter +infos.importfile +\end_layout + +\begin_layout Itemize + +\family typewriter +infos.importdate +\end_layout + +\begin_layout Itemize + +\family typewriter +infos.sourcetype +\end_layout + +\begin_layout Itemize + +\family typewriter +infos.recdate +\end_layout + +\begin_layout Itemize + +\family typewriter +infos.rectime +\end_layout + +\begin_layout Standard +Some data manipulation functions (in particular, pspm_trim) update infos + to record some file history. + +\end_layout + +\begin_layout Subsection +How to add a new import data type +\end_layout + +\begin_layout Subsubsection +Add function +\end_layout + +\begin_layout Standard +\paragraph_spacing single +\noindent +\align block +Function name: pspm_get_xxx (where xxx is the data type name). + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Format: +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\paragraph_spacing single +\noindent +\align block + +\family typewriter +[sts, import, sourceinfo] = pspm_get_xxx(datafile, import) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family default +The function needs to take an import job and add, for each job, fields +\end_layout + +\begin_layout Itemize +\noindent +\align block +.data - the actual data for this channel (column vector) +\end_layout + +\begin_layout Itemize +\noindent +\align block +.sr - the sample rate for this channel (only if .autosr enabled in pspm_init) + +\end_layout + +\begin_layout Standard +\noindent +\align block +optional fields +\end_layout + +\begin_layout Itemize +\noindent +\align block +.marker - for marker channels (timestamps or continuous, see pspm_get_marker) + +\end_layout + +\begin_layout Itemize +\noindent +\align block +.markerinfo – optional, see pspm_get_marker +\end_layout + +\begin_layout Itemize +\noindent +\align block +.minfreq - minimum frequency for pulse channels +\end_layout + +\begin_layout Itemize +\noindent +\align block +.units - if data units are defined by the recording software +\end_layout + +\begin_layout Itemize +\noindent +\align block +sts: -1 if import is unsuccessful +\end_layout + +\begin_layout Standard +\noindent +\align block +sourceinfo: contains information on the source file, with field +\end_layout + +\begin_layout Itemize +\noindent +\align block +.chan - a cell of string descriptions of the imported source channels, e. + g. + names, or numbers any optional fields that will be added to infos.source + (e. + g. + recording date & time, and others) +\family typewriter + +\end_layout + +\begin_layout Standard +Notes for multiple blocks: file formats that support multiple block storage + within one file can return cell arrays import{1:blkno} and sourceinfo{1:blkno}; + PsPM will save individual files for each block, with a filename 'pspm_fn_blk0x.m +at'. +\end_layout + +\begin_layout Subsubsection +Add information to settings +\end_layout + +\begin_layout Standard +The file pspm_init contains a block that defines possible import data types. + Add a new field here +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent + +\family typewriter +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout +\noindent + +% Description of data type +\end_layout + +\begin_layout Plain Layout +\noindent + +% --------------------------------------------- +\end_layout + +\begin_layout Plain Layout +\noindent + +defaults.import.datatypes(1) = ... + +\end_layout + +\begin_layout Plain Layout +\noindent + +struct('short', 'xxx', ... + % short name for internal purposes +\end_layout + +\begin_layout Plain Layout + +'long', 'Datatype description', ... + % long name for GUI +\end_layout + +\begin_layout Plain Layout + +'ext', '*', ... + % data file extension +\end_layout + +\begin_layout Plain Layout + +'funct', @pspm_get_xxx, ... + % import function +\end_layout + +\begin_layout Plain Layout + +'chantypes', {{defaults.chantypes.type}}, ... + % allowed channel types +\end_layout + +\begin_layout Plain Layout + +'chandescription', 'channel', ... + % description of channels for GUI +\end_layout + +\begin_layout Plain Layout + +'multioption', 1, ... + % import of multiple channels for GUI +\end_layout + +\begin_layout Plain Layout + +'searchoption', 1, ... + % allow channel name search for GUI +\end_layout + +\begin_layout Plain Layout + +'automarker', 0, ... + % marker not stored in separate channel +\end_layout + +\begin_layout Plain Layout + +'autosr', 1); % sample rate automatically assigned +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Good to know: +\end_layout + +\begin_layout Itemize +the β€œlong” definition is used in the GUI – make sure it’s readable +\end_layout + +\begin_layout Itemize +if no event channels can be imported, change .chantypes +\end_layout + +\begin_layout Itemize +if channels have searchable names in the import file, set .searchoption = + 1 +\end_layout + +\begin_layout Itemize +if no channel number needs to be assigned for the marker channel, set .automarker + = 1 +\end_layout + +\begin_layout Itemize +if sample rate is contained in import file and determined during import, + set .autosr = 1 +\end_layout + +\begin_layout Itemize +if you need external functions – put them into a folder in the β€˜import’ + subdirectory and add/remove this path within the pspm_get_xxx function +\end_layout + +\begin_layout Subsection +How to add a new channel type +\end_layout + +\begin_layout Subsubsection +Add function +\end_layout + +\begin_layout Standard +Function name: pspm_get_xxx (where xxx is the channel type) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Format: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family typewriter +[sts, data] = pspm_get_channeltype(import) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family default +data: data cell of structure readable by pspm_load_data +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Good to know: for event channels, use the function pspm_get_events to convert + various event formats into time stamps (see pspm_get_marker or pspm_get_hb + as an example) +\end_layout + +\begin_layout Subsubsection +Add information to settings +\end_layout + +\begin_layout Standard +Add information on the new channel type and import function to +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family typewriter + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +defaults.chantypes(k).type = 'xxx';% channel type name +\end_layout + +\begin_layout Plain Layout + +defaults.chantypes(k).import = @pspm_get_xxx; % conversion function +\end_layout + +\begin_layout Plain Layout + +defaults.chantypes(k).data = 'xxx'; % ’wave’ or ’events’ +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +How to add a new GLM type +\end_layout + +\begin_layout Subsubsection +Add information to settings (Example SCR) +\end_layout + +\begin_layout Standard + +\family typewriter +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +defaults.glm(1) = ... + +\end_layout + +\begin_layout Plain Layout + +struct('modality', 'scr', ... + % modality name +\end_layout + +\begin_layout Plain Layout + +'cbf', struct('fhandle', @pspm_bf_scrf, 'args', 1), ... + +\end_layout + +\begin_layout Plain Layout + +% default basis function/set +\end_layout + +\begin_layout Plain Layout + +'filter', struct('lpfreq', 5, 'lporder', 1, ... + +\end_layout + +\begin_layout Plain Layout + +'hpfreq', 0.05, 'hporder', 1, 'down', 10, 'direction', 'uni')); +\end_layout + +\begin_layout Plain Layout + +% default filter settings +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Add default basis function +\end_layout + +\begin_layout Standard +Function name: pspm_bf_xxx +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Function arguments: vector of arguments, first element is time resolution, + further arguments as defined in defaults.glm(n).cbf.args +\end_layout + +\begin_layout Subsection +Warning IDs in PsPM +\end_layout + +\begin_layout Subsubsection +General +\end_layout + +\begin_layout Itemize +invalid_input +\end_layout + +\begin_layout Itemize +invalid_channeltype +\end_layout + +\begin_layout Itemize +nonexistent_file +\end_layout + +\begin_layout Itemize +channel_not_contained_in_file +\end_layout + +\begin_layout Itemize +obsolete_function +\end_layout + +\begin_layout Itemize +not_allowed_channeltype +\end_layout + +\begin_layout Itemize +invalid_data_structure +\end_layout + +\begin_layout Itemize +no_matching_channels +\end_layout + +\begin_layout Itemize +unknown_action +\end_layout + +\begin_layout Itemize +missing_data +\end_layout + +\begin_layout Itemize +out_of_range +\end_layout + +\begin_layout Subsubsection +Function specific +\end_layout + +\begin_layout Standard +pspm_load1 +\end_layout + +\begin_layout Itemize +not_saving_data +\end_layout + +\begin_layout Standard +pspm_interpolate +\end_layout + +\begin_layout Itemize +option_disabled +\end_layout + +\begin_layout Standard +pspm_trim +\end_layout + +\begin_layout Itemize +marker_out_of_range +\end_layout + +\begin_layout Standard +pspm_find_channel +\end_layout + +\begin_layout Itemize +multiple_matching_channels +\end_layout + +\begin_layout Standard +pspm_find_sounds +\end_layout + +\begin_layout Itemize +no_marker_chan +\end_layout + +\begin_layout Itemize +no_sound_chan +\end_layout + +\begin_layout Standard +pspm_get_scr +\end_layout + +\begin_layout Itemize +no_conversion_constant +\end_layout + +\begin_layout Standard +pspm_pp +\end_layout + +\begin_layout Itemize +invalid_freq +\end_layout + +\begin_layout Standard +pspm_prepdata +\end_layout + +\begin_layout Itemize +no_low_pass_filtering +\end_layout + +\begin_layout Itemize +downsampling_failed +\end_layout + +\begin_layout Itemize +nonint_sr +\end_layout + +\begin_layout Standard +pspm_get_timing +\end_layout + +\begin_layout Itemize +invalid_vector_size +\end_layout + +\begin_layout Itemize +event_names_dont_match +\end_layout + +\begin_layout Itemize +no_numeric_vector +\end_layout + +\begin_layout Itemize +no_integers +\end_layout + +\begin_layout Standard +pspm_down +\end_layout + +\begin_layout Itemize +rate_below_minimum +\end_layout + +\begin_layout Section +List of data formats +\end_layout + +\begin_layout Subsection +Supported Channel types +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + + + + + + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Data format +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +SCR +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ECG +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Heart Rate +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Heart Beat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Heart Period +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Respiration +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Pupil Size +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Marker +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Custom +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Sound channel +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Pulse oxymeter +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Gaze x/y, l/r +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +CED Spike +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Matlab +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Biopach AcqKnowledge ( +\begin_inset Formula $\leq$ +\end_inset + + v3.9.0) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Biopac AcqKnowledge (exported) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Labchart (any Version, Windows only) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Labchart exported +\end_layout + +\begin_layout Plain Layout +( +\begin_inset Formula $\leq$ +\end_inset + + v7.1) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Labchart exported +\end_layout + +\begin_layout Plain Layout +( +\begin_inset Formula $\geq$ +\end_inset + + v7.2) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +VarioPort +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Biograph Infiniti (exported) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Mindmedia Biotrace (exported) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Brain Vision +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Windaq (wdq) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Observer XT compatible +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +NeuroScan +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +BioSemi +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Eyelink +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +European Data Format +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Philips Scanphyslog +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +SMI +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ViewPoint +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsection +Further settings +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Data format +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Datatype +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +File extension +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Manufacturer +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Import multiple channels +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Search channel names +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Automarker +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Ask for sampling rate +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +CED Spike +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +spike +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.smr +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +CED +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Matlab +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +mat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.mat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Text +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Biopach AcqKnowledge ( +\begin_inset Formula $\leq$ +\end_inset + + v3.9.0) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +acq +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.acq +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Biopac +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Biopac AcqKnowledge (exported) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +acqmat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.mat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Biopac +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Labchart (any Version, Windows only) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +labchart +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.adicht +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ADInstruments +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Labchart exported +\end_layout + +\begin_layout Plain Layout +( +\begin_inset Formula $\leq$ +\end_inset + + v7.1) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +labchartmat_ext +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.mat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ADInstruments +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Labchart exported +\end_layout + +\begin_layout Plain Layout +( +\begin_inset Formula $\geq$ +\end_inset + + v7.2) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +labchartmat_in +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.mat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ADInstruments +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +VarioPort +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +vario +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.vpd +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Becker MediTec +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Biograph Infiniti (exported) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +biograph +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Thought Technology +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Mindmedia Biotrace (exported) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +biotrace +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +MindMedia +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Brain Vision +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +brainvision +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.eeg +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +BrainProducts +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Windaq (wdq) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +windaq +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.wdq +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dataq +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Observer XT compatible +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +observer +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.any +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Noldus +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +NeuroScan +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +cnt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.cnt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +BioSemi +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +biosemi +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.bdf +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Eyelink +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.asc +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +European Data Format +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +edf +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.edf +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +European Data Format +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Philips Scanphyslog +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.log +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Philips +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +SMI +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +SensoMotoric Instruments +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +ViewPoint +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +.txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Arrington Research +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +βœ“ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Standard +Note: Automarkers means no channel number has to be specified because markers + are always at the same place. +\end_layout + +\begin_layout Section +GUI +\end_layout + +\begin_layout Standard + +\shape italic +Contributed by Gabriel GrΓ€ni. +\end_layout + +\begin_layout Subsection +Matlabbatch: Getting started +\end_layout + +\begin_layout Enumerate +Add the trunk folder to the matlab path +\end_layout + +\begin_layout Enumerate +Type pspm_init into the command window (after the execution of the command + the folders pspm_cfg and matlabbatch should be added to the matlab path) +\end_layout + +\begin_layout Enumerate +Start matlabbatch by the typing cfg_ui into the command window +\end_layout + +\begin_layout Enumerate +If the item PsPM exists in the menu bar of matlabbatch you can skip steps + 5 to 7 and continue at step 8 +\end_layout + +\begin_layout Enumerate +Select –> File –> Add Application +\end_layout + +\begin_layout Enumerate +Navigate to the folder pspm_cfg on the left hand side of the window and + select the file pspm_cfg.m on the right hand side –> Press the button Done +\end_layout + +\begin_layout Enumerate +A new item, called PsPM, will appear in the upper menu bar. +\end_layout + +\begin_layout Enumerate +By selecting PsPM the desired action can be selected (at the moment, there + is only Data Preparation –> {Import, Trim} available) +\end_layout + +\begin_layout Subsubsection +Example Function: Trim +\end_layout + +\begin_layout Standard +This example demonstrates how matlabbatch can be used to execute a function. + For all other functions matlabbatch behaves in the same manner. +\end_layout + +\begin_layout Itemize +Select a file by pressing the Select Files Button (under Datafile) +\end_layout + +\begin_layout Itemize +Select Reference and choose an item in the lower part of the window +\end_layout + +\begin_layout Itemize +Fill in the desired values in the fields which are marked with "<-X" +\end_layout + +\begin_layout Itemize +After you have chosen a file and filled in all values correctly, you will + see a green arrow on the upper left part of the window +\end_layout + +\begin_layout Itemize +By pressing on the green arrow the selected file will be trimmed according + to the filled in values +\end_layout + +\begin_layout Subsection +Matlabbatch: How to +\end_layout + +\begin_layout Subsubsection +Preliminaries +\end_layout + +\begin_layout Itemize +Add folder of matlabbatch to the matlab path +\end_layout + +\begin_layout Itemize +Add first application and then load the batch in order to execute a function + +\end_layout + +\begin_layout Subsubsection +Some notes for creating a new application +\end_layout + +\begin_layout Itemize +Leafs (items) are specified first +\end_layout + +\begin_layout Itemize +Assigning child items to .val or .values fields of their parent items +\end_layout + +\begin_layout Itemize +Root node of a tree is specified last +\end_layout + +\begin_layout Itemize +Some examples of items: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Itemize +cfg_item: +\begin_inset Newline newline +\end_inset + + +\family typewriter + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +item1= cfg_item; % Defines generic configuration item +\end_layout + +\begin_layout Plain Layout + +item1.name= 'Def 1'; % The display name +\end_layout + +\begin_layout Plain Layout + +item1.tag = 'def1'; % The name appearing in the harvested job +\end_layout + +\begin_layout Plain Layout + +% structure. + This name must be unique +\end_layout + +\begin_layout Plain Layout + +% among all items in the val field of the +\end_layout + +\begin_layout Plain Layout + +% superior node +\end_layout + +\begin_layout Plain Layout + +item1.val = {true}; % Value of item (optional) +\end_layout + +\begin_layout Plain Layout + +item1.help = {'Help...'}; % Help text +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +cfg_entry: +\begin_inset Newline newline +\end_inset + + +\family typewriter + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +entry1 = cfg_entry; % Defines entry configuration item +\end_layout + +\begin_layout Plain Layout + +entry1.name = 'Input'; +\end_layout + +\begin_layout Plain Layout + +entry1.tag = 'input'; +\end_layout + +\begin_layout Plain Layout + +entry1.strtye = 'r'; % Type of values which can be entered +\end_layout + +\begin_layout Plain Layout + +entry1.num = [1 1]; % Expected dimension of the input +\end_layout + +\begin_layout Plain Layout + +entry1.help = {'Help...'}; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +cfg_choice: +\begin_inset Newline newline +\end_inset + + +\family typewriter + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +choice = cfg_item; % Defines choice configuration item +\end_layout + +\begin_layout Plain Layout + +choice.name = 'Choice'; +\end_layout + +\begin_layout Plain Layout + +choice.tag = 'choice'; +\end_layout + +\begin_layout Plain Layout + +choice.values = {item1, entry1}; % Defines which items will be +\end_layout + +\begin_layout Plain Layout + +% selectable in the choice menu. + +\end_layout + +\begin_layout Plain Layout + +choice.help = {'Help...'}; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +cfg_exbranch: +\begin_inset Newline newline +\end_inset + + +\family typewriter + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +fct = cfg_exbranch; % Defines the branch that has information +\end_layout + +\begin_layout Plain Layout + +% about how to run this module fct.name = 'Trim'; +\end_layout + +\begin_layout Plain Layout + +fct.tag = 'trim'; +\end_layout + +\begin_layout Plain Layout + +fct.val = {choice}; % The items that belong to this branch. + +\end_layout + +\begin_layout Plain Layout + +% All items must be filled before this +\end_layout + +\begin_layout Plain Layout + +% branch can run or produce virtual +\end_layout + +\begin_layout Plain Layout + +% outputs +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +fct.prog = @cfg_run_fct; % A function handle that will be called +\end_layout + +\begin_layout Plain Layout + +% with the harvested job to run the +\end_layout + +\begin_layout Plain Layout + +% computation +\end_layout + +\begin_layout Plain Layout + +trim.vout = @cfg_vout_fct; % A function handle that will be +\end_layout + +\begin_layout Plain Layout + +% called with the harvested job to +\end_layout + +\begin_layout Plain Layout + +% determine virtual outputs +\end_layout + +\begin_layout Plain Layout + +trim.help = {Help...'}; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +There exists a number of other item classes. + Here is a list of the most important classes: cfg_item, cfg_entry, cfg_choice, + cfg_menu, cfg_exbranch, cfg_files, cfg_branch, cfg_repeat +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +For more information call the help function in matlab (e.g. + help help cfg_item) +\end_layout + +\end_deeper +\begin_layout Itemize +Note: +\begin_inset Newline newline +\end_inset + +The inputs to each module have to be described in a tree-like structure. +\begin_inset Newline newline +\end_inset + +During data entry, there is no way to change the tree structure based on + input data. + Add application to the configuration tree by default +\end_layout + +\begin_layout Subsubsection +Add application to the configuration tree by default +\end_layout + +\begin_layout Standard +In the following it is shown how an application can be added to the menu + bar of matlabbatch by default (without adding it every time matlabbatch + is started) +\end_layout + +\begin_layout Itemize +Start matlabbatch and add the appliaction cfg_confgui in the folder matlabbatch/ +cfg_confgui +\end_layout + +\begin_layout Itemize +Put Generate code into the Module list by selecting ConfGUI –> Generate + code in the menu bar +\end_layout + +\begin_layout Itemize +Fill out all the input fields on the right side: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Itemize +Output filename: This file will contain the whole menu structure, validity + constraints and links to run time code of the appliaction. +\end_layout + +\begin_layout Itemize +Output directory: All files which are created by the ConfGUI will be stored + into this directory (chose a directory which is added to the matlab path) +\end_layout + +\begin_layout Itemize +Root node of config: Name of the root node of the appliaction's configuration + tree +\end_layout + +\begin_layout Itemize +Options: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Create Defaults File: Yes +\end_layout + +\begin_layout Enumerate +Create mlbatch_appcfg File: Yes +\end_layout + +\begin_layout Enumerate +Create Code for addpath(): No +\end_layout + +\end_deeper +\end_deeper +\begin_layout Itemize +Finally press the green arrow on the upper left side of the batch editor +\end_layout + +\begin_layout Itemize +As no error occurred 3 new files ({Output filename}.m, {Output filename}_def.m, + cfg_mlbatch_appcfg.m) should be created and added into the folder {Output + directory}. +\end_layout + +\begin_layout Itemize +Each time matlabbatch is started, it will search for any cfg_mlbatch_appcfg.m + file (this file contains the names of the configuration files) and will + add the corresponding application to the batch editor. + +\end_layout + +\begin_layout Subsubsection +Add modules to module list +\end_layout + +\begin_layout Standard +Example: Module Import and Trim will be added to the module list +\family typewriter + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset listings +inline false +status open + +\begin_layout Plain Layout + +arg1 = 'scr.prep.import_data'; +\end_layout + +\begin_layout Plain Layout + +arg2 = 'scr.prep.trim'; +\end_layout + +\begin_layout Plain Layout + +mod_cfg_id1 = cfg_util('tag2mod_cfg_id',arg1); +\end_layout + +\begin_layout Plain Layout + +mod_cfg_id2 = cfg_util('tag2mod_cfg_id',arg2); +\end_layout + +\begin_layout Plain Layout + +cjob = cfg_util('initjob'); +\end_layout + +\begin_layout Plain Layout + +mod_job_id1 = cfg_util('addtojob', cjob, mod_cfg_id1); +\end_layout + +\begin_layout Plain Layout + +mod_job_id2 = cfg_util('addtojob', cjob, mod_cfg_id2); +\end_layout + +\begin_layout Plain Layout + +cfg_util('harvest', cjob, mod_job_id1); +\end_layout + +\begin_layout Plain Layout + +cfg_util('harvest', cjob, mod_job_id2); +\end_layout + +\begin_layout Plain Layout + +cfg_ui('local_showjob', cfg_ui, cjob); +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Changes +\end_layout + +\begin_layout Itemize +In the function private/cfg_onscreen at line 36 figure(fg); is commented + out in order to prevent the appearance of the GUI for a short time if the + function cfg_ui('Visible', 'off') is called. +\end_layout + +\begin_layout Subsection +Matlabbatch: changing help texts and fieldnames +\end_layout + +\begin_layout Subsubsection +File structure of matlabbatch GUI +\end_layout + +\begin_layout Standard +There exist two files per function: 1 configuration file and 1 run file. + The configuration file defines the structure of the corresponding function + in the matlabbatch GUI whereas the run file firstly gathers all entered + values and secondly calls the corresponding SCR function. + Both types of files are located in the subfolder pspm_cfg. + The name of a configuration or a run file consists of two parts. + The prefix of a configuration filename is called pspm_cfg_ whereas the + filename of a run file begins with pspm_cfg_run. + The second part of the filename is named after the function name (eg. + for the function pspm_import.m -> pspm_cfg_import.m, pspm_cfg_run_import.m). +\end_layout + +\begin_layout Subsubsection +Edit help texts and fieldname +\end_layout + +\begin_layout Standard +In order to change any help text or fieldname in a matlabbatch GUI function + the corresponding configuration file has to be opened. + For each item in a matlabbatch GUI function a struct variable which contains + several struct fields is defined in the configuration file. + +\end_layout + +\begin_layout Itemize +Help text The field .help defines the help text of the item which can be + edited in order to change the help text. + As soon as matlabbatch has been closed and opened again, the changes in + the help text will be visible in matlabbatch GUI. +\end_layout + +\begin_layout Itemize +Fieldname The fieldname of an matlabbatch GUI item is defined by the struct + field .tag . + In case a fieldname of an item should be changed be careful to verify if + no other item, which has the same root node, hold the same fieldname. + Otherwise matlabbatch will not work properly. + After the fieldname of an item has been changed the run file (pspm_cfg_run_func +tionname.m) of the corresponding function has to be adapted as well in order + to ensure that the function call in the run file is done properly. + +\end_layout + +\begin_layout Section +Test Environment +\end_layout + +\begin_layout Standard + +\shape italic +Contributed by Linus RΓΌttimann & Tobias Moser. +\end_layout + +\begin_layout Subsection +Unittest: General implementation +\end_layout + +\begin_layout Standard +In PsPM the Matlab Unit Testing Framework is used for testing of functions. + For each tested function there is a Matlab class with the name β€˜functionname_te +st’, which contains the unittests for that specific function. + Additionally there is a documentation page for each of the test classes, + where information about the unittests can be found. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +To run the unittests of a test class, an object of the class has to be created: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +testCase = functionname_test +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +where β€˜testCase’ is an arbitrary object name and β€˜funtionname_test’ is the + name of a test class. + Then all the unittest that are contained in the test class can be run with: + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +testCase.run +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +A specific unittest can be run with: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +testCase.run(β€˜unittest_name’) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Remember that a new test class object must be generated each time the test + class has been changed. +\end_layout + +\begin_layout Subsection +Parameterized test classes +\end_layout + +\begin_layout Standard +Parmeterized test classes is a feature provided by the Matlab test case + class. + A test class is parameterized when it has +\end_layout + +\begin_layout Itemize +Test parameters defined (within the property section) +\end_layout + +\begin_layout Itemize +Test methods implementing the defined test parameters +\end_layout + +\begin_layout Standard +Each function implementing test parameters will be called multiple times + with each possible parameter combination (which is determined by Matlab). + Thus parameterized classes allow to write single tests for different parameter + combinations. + If one of the following test cases is a parameterized test class, it will + be mentioned accordingly. +\end_layout + +\begin_layout Subsection +Testcases: pspm_align_channels_test +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_align_channels_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data, duration] = pspm_align_channels(data, induration) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +This test uses data stored in +\family typewriter +ImportTestData/ecg2hb/tpspm_s102_s1.mat +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings given invalid inputs. +\end_layout + +\begin_layout Subsubsection* +Lower optional duration +\end_layout + +\begin_layout Standard +Function name: lower_optional_duration(this) +\begin_inset Newline newline +\end_inset + +Description: Passes an optional duration that is less than the maximum duration + of all channels in the input to pspm_align_channels. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Assert that lower optional duration has no effect on the output. +\end_layout + +\begin_layout Enumerate +Check if all of the returned channels have the same duration. +\end_layout + +\begin_layout Subsubsection* +Same optional duration +\end_layout + +\begin_layout Standard +Function name: same_optional_duration(this) +\begin_inset Newline newline +\end_inset + +Description: Passes an optional duration that is equal to the maximum duration + of all channels in the input to pspm_align_channels and does the exact + same checks as in lower duration case. +\end_layout + +\begin_layout Subsubsection* +Higher optional duration +\end_layout + +\begin_layout Standard +Function name: higher_optional_duration(this) +\begin_inset Newline newline +\end_inset + +Description: Passes an optional duration that is higher than the maximum + duration of all channels. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Assert that durations of all returned channels is the same as the passed + optional duration. +\end_layout + +\begin_layout Subsubsection* +Max duration is passed in marker channel +\end_layout + +\begin_layout Standard +Function name: max_duration_is_given_in_events(this) +\begin_inset Newline newline +\end_inset + +Description: Passes the maximum duration in marker channel to pspm_align_channel +s. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Assert that all returned channels are aligned to the maximum duration passed + in marker channel. +\end_layout + +\begin_layout Subsubsection* +Various case checks +\end_layout + +\begin_layout Standard +Function names: +\end_layout + +\begin_layout Enumerate +only_one_channel_longer_others_same(this) +\end_layout + +\begin_layout Enumerate +only_one_channel_shorter_others_same(this) +\end_layout + +\begin_layout Enumerate +increasing_channel_lengths(this) +\end_layout + +\begin_layout Enumerate +two_same_others_shorter(this) +\end_layout + +\begin_layout Standard +Description: In each of these cases check if the returned channels have + the same duration that is equal to the maximum duration of all input channels. +\end_layout + +\begin_layout Subsection +Testcases: pspm_bf_test +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_bf_test +\begin_inset Newline newline +\end_inset + +Function: [bs, x] = pspm_bf_ +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +This test class is parameterized. +\end_layout + +\begin_layout Subsubsection* + +\series bold +Method setup parameters +\end_layout + +\begin_layout Standard +These parameters define which function should be tested +\series bold +. +\begin_inset Newline newline +\end_inset + + +\series default + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Basis function +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Specifies the basis functions to test (without the 'pspm_bf_' prefix). + The current basis function to test is then called via this.bf(); +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Test parameters +\end_layout + +\begin_layout Standard +These are parameters which define what kind of data or option should be + passed to each basis function. +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Time res log +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Specifies for the basic test different time resolutions (argument 'td') + which a basis function should be able to handle (as long as td <= duration). + The values are logarithmic and have to be translated before passed to the + basis function. +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +this.bf() [no parameters] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +this.bf(dur+1) [pass 'td' > duration of function] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +this.bf(0) [invalid time resolution] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Basic +\end_layout + +\begin_layout Standard +Function name: test_basic(this, time_res_log) +\begin_inset Newline newline +\end_inset + +Description: Test for different requirements to verify whether the current + basis function is valid or not. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test with td = 0.1, verify that no warning is issued and determine the duration +\end_layout + +\begin_layout Enumerate +Test with td = 0.01 and check if the new duration is equal to the duration + calculated before. +\end_layout + +\begin_layout Enumerate +Test if function runs through without warning and that the time vector begins + at <= 0. +\end_layout + +\begin_layout Enumerate +Test if the function runs through without warning with td = 10^time_res_log + (as long as td < duration) +\end_layout + +\begin_layout Subsection +Testcases: pspm_convert_unit +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_convert_unit_test +\begin_inset Newline newline +\end_inset + +Function: [sts, converted] = pspm_convert_unit(data, from, to) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Subsubsection* +Constants +\end_layout + +\begin_layout Itemize +inch_to_cm = 2.54 +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(testCase) +\begin_inset Newline newline +\end_inset + +Description: Pass invalid from or to metrics and check if warnings are issued. +\end_layout + +\begin_layout Subsubsection* +Valid input +\end_layout + +\begin_layout Standard +Function name: valid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Pass various valid inputs and compare results to manually calculate +d ones. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +If empty input data is passed, result is also empty. +\end_layout + +\begin_layout Enumerate +Convert single cm value to m. +\end_layout + +\begin_layout Enumerate +Various unit conversion checks: +\end_layout + +\begin_deeper +\begin_layout Enumerate +Conversion between same units (cm to cm) +\end_layout + +\begin_layout Enumerate +mm to km and km to mm conversions +\end_layout + +\begin_layout Enumerate +inch to cm conversions +\end_layout + +\end_deeper +\begin_layout Enumerate +Negative value conversions +\end_layout + +\begin_layout Enumerate +Convert single dimensional array with multiple elements. +\end_layout + +\begin_layout Enumerate +Convert each element in 3D array. +\end_layout + +\begin_layout Subsection +Testcases: pspm_ecg2hb +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_ecg2hb_test +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Function: [sts,pt_debug] = pspm_ecg2hb(fn, chan, options) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Subsubsection* +Constants +\end_layout + +\begin_layout Itemize +testdata{0}.chan_struct = struct('nr', 1, 'name', 'ecg'); +\end_layout + +\begin_layout Itemize +testdata{0}.filename = 'ImportTestData +\backslash +ecg2hb +\backslash +test_ecg77.mat'; +\end_layout + +\begin_layout Itemize +testdata{0}.num_channels = 1 +\end_layout + +\begin_layout Itemize +testdata{1}.chan_struct = struct('nr', 3, 'name', 'ecg'); +\end_layout + +\begin_layout Itemize +testdata{1}.filename = 'ImportTestData +\backslash +ecg2hb +\backslash +tpspm_s102_s1.mat'; +\end_layout + +\begin_layout Itemize +testdata{1}.num_channels = 5 +\end_layout + +\begin_layout Itemize +backup_suffix = '_backup'; +\end_layout + +\begin_layout Itemize +options = struct('semi', 0); +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input arguments +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Description: Pass invalid input arguments and check if the warnings are + as expected. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ecg2hb() [no arguments] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ecg2hb(1) [invalid file name] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ecg2hb(this.fn, 'bla') [invalid channel (text)] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ecg2hb(this.fn, 1) [invalid channel type] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:not_allowed_channeltype +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +o.twthresh = 'bla'; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid twthresh + (text)] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +o.minHR = 202; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid minHR (> default_maxHR +)] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +o.minHR = 202; o.maxHR = 19; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid minHR + > maxHR] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +o.maxHR = 19; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid maxHR (< default_minHR) +] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +o.debugmode = 5; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid debugmode (not + in [0,1])] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +o.semi = 5; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid semi (not in [0,1])] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Valid input arguments +\end_layout + +\begin_layout Standard +Function name: valid_input(this) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Description: Pass valid input arguments and check if there are no warnings. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ecg2hb(this.fn, this.chan.nr, this.options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ecg2hb(this.fn, this.chan.name, this.options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +this.test_added_data() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Other Methods +\end_layout + +\begin_layout Subsubsection* +Test for added data +\end_layout + +\begin_layout Standard +Function name: test_added_data() +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Description: Check if added hb channels show an expected behaviour. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests (for each channel): +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Tested Value +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected Value +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Sampling rate +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Unit +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +'events' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Channel type +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +'hb' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Amount of data points in data +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +> 1 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Heartbeat indices are monotonically increasing +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +True +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Maximum number of heartbeats per second +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +< 5 +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Data is distributed equally (standard deviation) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +< 2s +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Time between end of recording and last data point +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +< 60s +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsection +Testcases: pspm_find_channel +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_find_channel_test +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Function: chan = pspm_find_channel(headercell, chantype) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input arguments +\end_layout + +\begin_layout Standard +Function name: invalid_inputargs(this) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Setup: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family typewriter +headercell = {'heart', 'scr', 'pupil'}; +\family default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel('str','scr') [no headercell] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel(headercell, 'str') +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:not_allowed_channeltype +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel(headercell, 4) [no string chantype] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Valid Input Arguments +\end_layout + +\begin_layout Standard +Function name: valid_inputargs(this) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Description: Checks for correct return value if the input arguments are + valid +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Setup: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family typewriter +headercell = {'heart', 'scr', 'pupil', 'mark', 'gsr', 'eda'}; +\family default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Exp. + Output +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel(headercell, 'pupil') +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel(headercell, 'resp') +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:no_matching_channels +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel(headercell, 'scr') +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:multiple_matching_channels +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel(headercell, {'mark', 'str', 'bla'}) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel(headercell, {'call', 'str', 'me'}) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +no matching channel, but no warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel(headercell, {'scr', 'gsr', 'eda'}) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +-1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +multiple matching channels, but no warning +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsection +Testcases: pspm_extract_segments +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_extract_segments_test +\begin_inset Newline newline +\end_inset + +Function: [sts, out] = pspm_extract_segments(varargin) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +This test class is parameterized. + For manual mode tests, the test data is generated by the function itself + and when needed, files will be written to testdatafile.mat. + For auto mode tests, the test data must be in +\family typewriter +ImportTestData/fitted_models +\family default + folder with names as specified in the tests. +\end_layout + +\begin_layout Subsubsection* +Test parameters +\end_layout + +\begin_layout Standard +These are parameters which define what kind of data should be passed to + +\family typewriter +pspm_extract_segments +\family default + in auto mode tests and which options should be set. +\end_layout + +\begin_layout Itemize +nan_output: This option defines whether the user wants to output the NaN + ratios of the trials for each condition. + If so, we values can be printed on the screen (on MATLAB command window) + or written to a created file. +\end_layout + +\begin_layout Itemize +nan_ratio: Defines ratio of NaN values in the generated test data +\end_layout + +\begin_layout Itemize +nr_trail: Number of trails in the generated test data +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. +\end_layout + +\begin_layout Standard +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_extract_segments() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_extract_segments('a','b') +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_extract_segments('manual',fn,0) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_inpu +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_extract_segments('manual',[0.1,2],0,timing) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_extract_segments('manual',fn,'a',timing) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_extract_segments('manual',fn,{'a'},timing) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_extract_segments('auto',{1}) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_extract_segments('auto','some') +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Test manual mode with indicated length +\end_layout + +\begin_layout Standard +Function name: test_manual_length(this,nr_trial,nan_ratio) +\begin_inset Newline newline +\end_inset + +Desctiption: Checks for equality of produced segments by pspm_extract_segments + with manually computed segments +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate segments form test data. +\end_layout + +\begin_layout Enumerate +Test if function call wirked WarningFree +\end_layout + +\begin_layout Enumerate +Test if variable 'segments' existis in output +\end_layout + +\begin_layout Enumerate +Test if correct number of segments were produced +\end_layout + +\begin_layout Enumerate +Test each segment holds correct data +\end_layout + +\begin_layout Subsubsection* +Test manual mode with durations +\end_layout + +\begin_layout Standard +Function name: test_manual_duration(this,nr_trial,nan_ratio) +\begin_inset Newline newline +\end_inset + +Desctiption: Checks for equality of produced segments by pspm_extract_segments + with manually computed segments +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate segments form test data. +\end_layout + +\begin_layout Enumerate +Test if function call wirked WarningFree +\end_layout + +\begin_layout Enumerate +Test if variable 'segments' existis in output +\end_layout + +\begin_layout Enumerate +Test if correct number of segments were produced +\end_layout + +\begin_layout Enumerate +Test each segment holds correct data +\end_layout + +\begin_layout Subsubsection* +Test auto mode with GLM using marker onsets +\end_layout + +\begin_layout Standard +Function name: +\family typewriter +test_auto_mode_glm_with_markers(this) +\family default + +\begin_inset Newline newline +\end_inset + +Description: Runs +\family typewriter +pspm_extract_segments +\family default + with a particular GLM model stored in +\family typewriter +ImportTestData/fitted_models +\family default + and compares the results to manually calculated results. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if length of the returned cell array (from now on called +\family typewriter +segments +\family default +) is the same as the number of conditions +\end_layout + +\begin_layout Enumerate +Test if shape of data arrays in each element of +\family typewriter +segments +\family default + agrees with the passed durations and number of onsets. +\end_layout + +\begin_layout Enumerate +Test if +\family typewriter +segments.trial_idx +\family default + agrees with input data. +\end_layout + +\begin_layout Enumerate +Test if statistics calculated manually from +\family typewriter +segments.data +\family default + is the same as +\family typewriter +segments.mean +\family default + and +\family typewriter +segments.std +\family default +. +\end_layout + +\begin_layout Enumerate +Compute each statistic field in each element of +\family typewriter +segments +\family default + manually using the input data and compare the results to +\family typewriter +segments +\family default +. +\end_layout + +\begin_layout Subsubsection* +Test auto mode with GLM using second onsets +\end_layout + +\begin_layout Standard +Function name: +\family typewriter +test_auto_mode_glm_with_seconds(this) +\family default + +\begin_inset Newline newline +\end_inset + +Description: Do the exact same tests as in +\family typewriter +test_auto_mode_glm_with_markers +\family default + but this time using seconds to specify onsets. +\end_layout + +\begin_layout Subsubsection* +Test auto mode with DCM +\end_layout + +\begin_layout Standard +Note: Since in DCM case onsets are calculated using trial start and end + seconds of DCM trials, there is no second/marker distinction in DCM test. +\begin_inset Newline newline +\end_inset + +Function name: +\family typewriter +test_auto_mode_dcm(this) +\family default + +\begin_inset Newline newline +\end_inset + +Description: Runs +\family typewriter +pspm_extract_segments +\family default + with a particular DCM model stored in +\family typewriter +ImportTestData/fitted_models +\family default + and compares the results to manually calculated results. + In order to get meaningful condition statistic information this test function + assigns the same trial name to certain groups of trials. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: Do the exact same tests as in +\family typewriter +test_auto_mode_glm_with_markers +\family default + by adapting the computation steps to DCM case. +\end_layout + +\begin_layout Subsection +Testcases: pspm_find_sounds +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_find_sounds_test +\begin_inset Newline newline +\end_inset + +Function: [sts, infos] = pspm_find_sounds(file, options) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +This test class is parameterized. + The test data is generated by the function itself and when needed, files + will be written to testdatafile.mat. +\end_layout + +\begin_layout Subsubsection* +Test parameters +\end_layout + +\begin_layout Standard +These are parameters which define what kind of data should be passed to + pspm_find_sounds and which options should be set. +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Channel output +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Specifies whether 'all' found markers or only 'corrected' markers should + be returned. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Max delay +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Varies the max delay option and defines how far away a marker at most can + be. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Min delay +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Varies the min delay option and defines how far away a marker at least should + be. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Threshold +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines the minimum size of a marker to be recognized as a marker event. + Passed in percent of the maximum amplitude of the recorded data. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Resample +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines whether the function should resample (and interpolate) the data + to a higher sample rate in order to get more exact marker findings. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Channel action +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines whether a newly created marker channel should replace the existing + marker channel or should be added as a new marker channel. +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds('') +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:file_not_found +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn) [invalid pspm file] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn) [pspm file without a 'snd' channel] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:no_sound_chan +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn, o) [invalid values for positive integer fields] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn, o) [invalid values for positive numeric fields] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn, o) [invalid values for logic fields] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn, o) [invalid channel ids for channel fields] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:out_of_range +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn, o) [enabled diagnostics without a marker channel] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:no_marker_chan +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn, o) [invalid values for channelaction] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn, o) [invalid values for roi] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds(fn, o) [maxdelay < mindelay] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Test add channel +\end_layout + +\begin_layout Standard +Function name: test_add_channel(this, channeloutput, max_delay, resample, + channelaction) +\begin_inset Newline newline +\end_inset + +Description: Test add channel with different options. + Diagnostics is always enabled, Channel output, Max delay, Resample and + Channel action are varied. + Once pspm_find_sounds is complete, the function tests if the returned data + has the expected format. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with channel 'snd' and 'marker'; and count amount of reference + markers +\end_layout + +\begin_layout Enumerate +Set +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +options according to test parameters +\end_layout + +\begin_layout Enumerate +diagnostics to 1 +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if returned data has the correct format +\end_layout + +\begin_layout Enumerate +Test if channels has been added or replaced +\end_layout + +\begin_layout Enumerate +Test if added channel has correct amount of data +\end_layout + +\begin_layout Subsubsection* +Test region count +\end_layout + +\begin_layout Standard +Function name: test_region_count(this) +\begin_inset Newline newline +\end_inset + +Description: Test region of interest in combination with expected sound + count. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with channel 'snd' and 'marker' +\end_layout + +\begin_layout Enumerate +Test if function finds the function finds all markers in the whole file +\end_layout + +\begin_layout Enumerate +Test if function finds all the markers in the whole file with initial threshold + 1 +\end_layout + +\begin_layout Enumerate +Test if function finds half of the markers in half of the file +\end_layout + +\begin_layout Subsubsection* +Test threshold +\end_layout + +\begin_layout Standard +Function name: test_threshold(this, threshold) +\begin_inset Newline newline +\end_inset + +Description: Vary the threshold option and test whether the functions returnes + the expected data. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with channel 'snd' and 'marker' +\end_layout + +\begin_layout Enumerate +Set +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +threshold according to test parameter +\end_layout + +\begin_layout Enumerate +diagnostics to 1 +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if returned data has the correct format +\end_layout + +\begin_layout Subsubsection* +Test plot +\end_layout + +\begin_layout Standard +Function name: test_plot(this, threshold) +\begin_inset Newline newline +\end_inset + +Description: Test if the plot functions returne the expected data and runs + through without warning. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with channel 'snd' and 'marker' +\end_layout + +\begin_layout Enumerate +Set +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +plot to 1 +\end_layout + +\begin_layout Enumerate +diagnostics to 1 +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if returned data has the correct format +\end_layout + +\begin_layout Subsection +Testcases: pspm_find_valid_fixations +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_find_valid_fixations_test +\begin_inset Newline newline +\end_inset + +Function: [sts, out_file] = pspm_find_valid_fixations(fn, options) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +This test class is parameterized. + The test data is generated by the function itself and when needed, files + will be written to testdatafile.mat. +\end_layout + +\begin_layout Paragraph* +Test parameters +\end_layout + +\begin_layout Standard +These are parameters which define what kind of data should be passed to + pspm_find_valid_fixations and which options should be set. +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Distance +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Used for gaze validation; defines the distance between eyes and screen. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Aspect used +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Used for gaze validation; defines the aspect ratio set in the software. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Aspect actual +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Used for gaze validation; defines the aspect ratio of the hardware. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Screen size +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Used for gaze validation; defines the size of the screen in inches. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Eyes +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Is used for data generation and tells the function for which eyes data should + be generated. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Channel action +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines whether to 'add' or 'replace' existing channels. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Newfile +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines whether to create a new file or extend the existing file. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Overwrite +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines whether to overwrite the existing file or not. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Interpolate +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines whether to interpolate NaN values in validated channels or not. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Missing +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines whether to create a channel which holds information about which + positions have been set to NaN (and may have been interpolated afterwards). +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Work eye +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines which eyes should be used for fixation validation. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Work chans +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines which channels should be set to NaN during invalid fixations. +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations('a') +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.validate_fixations] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.box_degree] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.screen_settings] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [missing fields for options.screen_setting +s] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.aspect_actual] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.aspect_used] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.bitmap] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.display_size] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.display_size] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.fixation_point] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.channel_action] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.newfile] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.overwrite] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.interpolate] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.missing] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid eyes] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations(fn, options) [invalid options.channels] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Test work chans +\end_layout + +\begin_layout Standard +Function name: test_work_chans(this, work_chans) +\begin_inset Newline newline +\end_inset + +Description: Tests whether the option 'channels' actually works on the specified + channels or not. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz +e 20 and eyes 'lr' +\end_layout + +\begin_layout Enumerate +Set options with +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +overwrite = 1 +\end_layout + +\begin_layout Enumerate +channels = work_chans +\end_layout + +\begin_layout Enumerate +channel_action = 'add' +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if sts equals 1 +\end_layout + +\begin_layout Enumerate +Test if specified work_chans are added as new processed channels +\end_layout + +\begin_layout Subsubsection* +Test work eye +\end_layout + +\begin_layout Standard +Function name: test_work_eye(this, work_eye) +\begin_inset Newline newline +\end_inset + +Description: Test whether the option 'eyes' actually works on the specified + eyes or not. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz +e 20 and eyes 'lr' +\end_layout + +\begin_layout Enumerate +Set options with +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +overwrite = 1 +\end_layout + +\begin_layout Enumerate +eyes = work_eye +\end_layout + +\begin_layout Enumerate +channel_action = 'add' +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if sts equals 1 +\end_layout + +\begin_layout Enumerate +Test if specified eyes have been processed accordingly and test if not specified + eyes have ignored. +\end_layout + +\begin_layout Subsubsection* +Test missing +\end_layout + +\begin_layout Standard +Function name: test_missing(this, missing) +\begin_inset Newline newline +\end_inset + +Description: Test whether for each a a new missing channel is created if + missing is specified as true. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz +e 20 and eyes 'lr' +\end_layout + +\begin_layout Enumerate +Set options with +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +overwrite = 1 +\end_layout + +\begin_layout Enumerate +missing = missing +\end_layout + +\begin_layout Enumerate +channel_action = 'add' +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if sts equals 1 +\end_layout + +\begin_layout Enumerate +Depending on the status of 'missing' test if there are any missing channels + or if there is no missing channel +\end_layout + +\begin_layout Subsubsection* +Test interpolate +\end_layout + +\begin_layout Standard +Function name: test_interpolate(this, interpolate) +\begin_inset Newline newline +\end_inset + +Description: Test whether data is interpolated during periods which are + set to NaN by the function. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz +e 20 and eyes 'lr' +\end_layout + +\begin_layout Enumerate +Set options with +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +overwrite = 1 +\end_layout + +\begin_layout Enumerate +interpolate = interpolate +\end_layout + +\begin_layout Enumerate +channel_action = 'add' +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if sts equals 1 +\end_layout + +\begin_layout Enumerate +Depending on the status of 'interpolate' test whether there are some NaN + values or if NaN periods have been interpolated accordingly. +\end_layout + +\begin_layout Subsubsection* +Test overwrite +\end_layout + +\begin_layout Standard +Function name: test_overwrite(this, overwrite) +\begin_inset Newline newline +\end_inset + +Description: Test if files are overwritten, if specified with 'overwrite' + option. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz +e 20 and eyes 'lr' +\end_layout + +\begin_layout Enumerate +Set options with +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +overwrite = 1 +\end_layout + +\begin_layout Enumerate +interpolate = interpolate +\end_layout + +\begin_layout Enumerate +channel_action = 'add' +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if sts equals 1 +\end_layout + +\begin_layout Enumerate +Test if file has been overwritten or not (tests, if there are any new channels). +\end_layout + +\begin_layout Subsubsection* +Test channel action +\end_layout + +\begin_layout Standard +Function name: test_channel_action(this, channel_action) +\begin_inset Newline newline +\end_inset + +Description: Test if channels are added or replaced (according to channel_action +). +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz +e 20 and eyes 'lr' +\end_layout + +\begin_layout Enumerate +Set options with +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +overwrite = 1 +\end_layout + +\begin_layout Enumerate +channel_action = channel_action +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if sts equals 1 +\end_layout + +\begin_layout Enumerate +Test if channels have been added or replaced (tests, if there are any new + channels). +\end_layout + +\begin_layout Subsubsection* +Test newfile +\end_layout + +\begin_layout Standard +Function name: test_newfile(this, newfile) +\begin_inset Newline newline +\end_inset + +Description: Test whether the output is written to a newfile or to the input + file. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz +e 20 and eyes 'lr' +\end_layout + +\begin_layout Enumerate +Set options with +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +overwrite = 1 +\end_layout + +\begin_layout Enumerate +if newfile enabled +\end_layout + +\begin_deeper +\begin_layout Enumerate +search for new file name +\end_layout + +\begin_layout Enumerate +set options.newfile to new file name +\end_layout + +\end_deeper +\begin_layout Enumerate +if newfile is disabled, set options.newfile to '' +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if function runs through without warning +\end_layout + +\begin_layout Enumerate +Test if sts equals 1 +\end_layout + +\begin_layout Enumerate +Test if returned outputfile equals the specified newfile or not (depending + on the value of 'newfile') +\end_layout + +\begin_layout Subsubsection* +Test gaze validation +\end_layout + +\begin_layout Standard +Function name: test_gaze_validation(this, distance, screen_size, aspect_actual, + aspect_used, eyes) +\begin_inset Newline newline +\end_inset + +Description: Test whether gaze validation is done correctly. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with the according function parameters +\end_layout + +\begin_layout Enumerate +Iterate to returned degree values generated by the generation function +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +set function options +\end_layout + +\begin_deeper +\begin_layout Enumerate +overewrite = 1 +\end_layout + +\begin_layout Enumerate +validate_fixation =1 +\end_layout + +\begin_layout Enumerate +screen_settings and distance to function call settings +\end_layout + +\begin_layout Enumerate +missing = 1 +\end_layout + +\end_deeper +\begin_layout Enumerate +depending on the specified degree, test whether function runs through without + warnings or not +\end_layout + +\begin_layout Enumerate +load outputfile and test if (according to degree expectation) gaze validation + has been done or not +\end_layout + +\end_deeper +\begin_layout Subsubsection* +Test bitmap validtion +\end_layout + +\begin_layout Standard +Function name: test_bitmap_validation(this, distance, resolution, eyes) +\begin_inset Newline newline +\end_inset + +Description: Test whether bitmap validation is done correctly. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with the according function parameters +\end_layout + +\begin_layout Enumerate +Iterate to returned bitmaps generated by the generation function +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +set function options +\end_layout + +\begin_deeper +\begin_layout Enumerate +missing = 1 +\end_layout + +\end_deeper +\begin_layout Enumerate +ddepending on the specified number of valid fixations in the bitmap, test + whether function runs through without warnings or not +\end_layout + +\begin_layout Enumerate +load outputfile and test if (according to bitmap expectation) bitmap validation + has been done or not +\end_layout + +\end_deeper +\begin_layout Subsection +Testcases: pspm_get_ecg +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_ecg_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data] = pspm_get_ecg(import) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Test +\end_layout + +\begin_layout Standard +Function name: test(this) +\begin_inset Newline newline +\end_inset + +Description: Test if all fields are returned correctly +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +Test if data.data is equal import.data +\end_layout + +\begin_layout Enumerate +Test if data.header.chantype is β€˜ecg’ +\end_layout + +\begin_layout Enumerate +Test if data.header.units is equal import.units +\end_layout + +\begin_layout Enumerate +Test if data.header.sr is equal import.sr +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_events +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_events_test +\begin_inset Newline newline +\end_inset + +Function: [sts, import] = pspm_get_events(import) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Check warnings +\end_layout + +\begin_layout Standard +Function name: check_warnings(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the field β€˜.markers’ is missing or contains + invalid content. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +Missing marker field +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:nonexistent_field +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +import.marker = β€˜foo’ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_field_content +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Timestamps +\end_layout + +\begin_layout Standard +Function name: timestamps(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for correct output if the input is timestamp data +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +Test if the length of the output data is equal to the length of the input + data +\end_layout + +\begin_layout Subsubsection* +Continuous +\end_layout + +\begin_layout Standard +Function name: continuous(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for correct output if the input is continuous data +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Perform three tests with different settings +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Standard +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +Test if the length of the field 'markerinfo' is equal to the length of the + output data. +\end_layout + +\begin_layout Enumerate +Test if the length of the output data is equal to the expected number of + pulses in the input data. +\end_layout + +\begin_layout Standard +Settings: +\end_layout + +\begin_layout Enumerate +flank = β€˜both’ (default) +\end_layout + +\begin_layout Enumerate +flank = 'both' & data offset 50 +\end_layout + +\begin_layout Enumerate +flank = β€˜ascending’ +\end_layout + +\begin_layout Enumerate +flank = β€˜descending’ +\end_layout + +\begin_layout Enumerate +inverted input signal +\end_layout + +\begin_layout Enumerate +signal with angular flanks +\end_layout + +\begin_layout Enumerate +check with +\end_layout + +\end_deeper +\begin_layout Enumerate +Additional test for setting (b): Test if data offset has been removed in + the output data. +\end_layout + +\begin_layout Enumerate +Additional test for setting (c) and (d): Test if positions returned by output + data correspond to flank changes in the input data. +\end_layout + +\begin_layout Enumerate +Test if markerinfo is not set if it has been set before. +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_eyelink +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_eyelink_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data] = pspm_get_eyelink(import) +\end_layout + +\begin_layout Subsubsection +Methods +\end_layout + +\begin_layout Subsubsection* +set_import_values +\end_layout + +\begin_layout Standard +Function : [import_struct, channel typles] = set_import_values(this) +\begin_inset Newline newline +\end_inset + +Description: Helperfunction, which creates an import data set and the expected + channel data set +\end_layout + +\begin_layout Subsubsection* +verify_basic_data_structure +\end_layout + +\begin_layout Standard +Function name: verify_basic_data_structure(this, data, sourceinfo, channel_types +) +\begin_inset Newline newline +\end_inset + +Description: Tests if the returned data structure is valid and match a given + expected pattern. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if all channels are numeric +\end_layout + +\begin_layout Enumerate +Test if recorded time and date have a valid format +\end_layout + +\begin_layout Enumerate +Test if blink channels have correct unit +\end_layout + +\begin_layout Enumerate +Test if pupil channels have either 'diameter' or 'area' as unit +\end_layout + +\begin_layout Enumerate +Test if channels labeled with 'position' have unit 'pixel' +\end_layout + +\begin_layout Enumerate +Test if channels labeled with 'blink' have unit 'blink' +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +test_multi_session +\end_layout + +\begin_layout Standard +Function name: test_multi_session(this) +\begin_inset Newline newline +\end_inset + +Description: Test if the returned data structure fits into the pattern of + a multi session data set. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Calls 'set_import_values(this)' to get import data set and expected channel + data set +\end_layout + +\begin_layout Enumerate +passses returned sets to 'verify_basic_data_structure()' +\end_layout + +\begin_layout Subsubsection* +test_two_eyes +\end_layout + +\begin_layout Standard +Function name: test_two_eyes(this) +\begin_inset Newline newline +\end_inset + +Description: Test if the returned data structure fits into the pattern of + a two eyes data set. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Calls 'set_import_values(this)' to get import data set and expected channel + data set +\end_layout + +\begin_layout Enumerate +passes returned sets to 'verify_basic_data_structure()' +\end_layout + +\begin_layout Subsubsection* +test_one_eye +\end_layout + +\begin_layout Standard +Function name: test_one_eye(this) +\begin_inset Newline newline +\end_inset + +Description: Test if the returned data structure fits into the pattern of + a one eye data set. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Creates an import data set and the expected channel data set an pass it + to 'verify_basic_data_structure()' +\end_layout + +\begin_layout Subsubsection* +test_track_dist +\end_layout + +\begin_layout Standard +Function name: test_track_dist(this) +\begin_inset Newline newline +\end_inset + +Description: Test if the returned data structure fits into the pattern of + a two eyes data with eyelink_trackdist set. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Calls 'set_import_values(this)' to get import data set and expected channel + data set +\end_layout + +\begin_layout Enumerate +owerwrites some import data and channel data +\end_layout + +\begin_layout Enumerate +pass returned sets to 'verify_basic_data_structure()' +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_hb +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_hb_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data] = pspm_get_hb(import) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Test +\end_layout + +\begin_layout Standard +Function name: test(this) +\begin_inset Newline newline +\end_inset + +Description: Test if all fields are returned correctly +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +Test if data.data is equal import.data +\end_layout + +\begin_layout Enumerate +Test if data.header.chantype is β€˜hb’ +\end_layout + +\begin_layout Enumerate +Test if data.header.units is β€˜events’ +\end_layout + +\begin_layout Enumerate +Test if data.header.sr is 1 +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_hr +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_hr_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data] = pspm_get_hr(import) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Test +\end_layout + +\begin_layout Standard +Function name: test(this) +\begin_inset Newline newline +\end_inset + +Description: Test if all fields are returned correctly +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +Test if data.data is equal import.data +\end_layout + +\begin_layout Enumerate +Test if data.header.chantype is β€˜hr’ +\end_layout + +\begin_layout Enumerate +Test if data.header.units is equal import.units +\end_layout + +\begin_layout Enumerate +Test if data.header.sr is equal import.sr +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_marker +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_marker_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data] = pspm_get_marker(import) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Test +\end_layout + +\begin_layout Standard +Function name: test(this) +\begin_inset Newline newline +\end_inset + +Description: Test if all fields are returned correctly +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +Test if data.data is equal import.data +\end_layout + +\begin_layout Enumerate +Test if data.header.chantype is β€˜marker’ +\end_layout + +\begin_layout Enumerate +Test if data.header.units is β€˜events’ +\end_layout + +\begin_layout Enumerate +Test if data.header.sr is 1 +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_pupil +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_pupil_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data] = pspm_get_pupil(import) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Test +\end_layout + +\begin_layout Standard +Function name: test(this) +\begin_inset Newline newline +\end_inset + +Description: Test if all fields are returned correctly +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +Test if data.data is equal import.data +\end_layout + +\begin_layout Enumerate +Test if data.header.chantype is β€˜pupil’ +\end_layout + +\begin_layout Enumerate +Test if data.header.units is equal import.units +\end_layout + +\begin_layout Enumerate +Test if data.header.sr is equal import.sr +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_resp +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_resp_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data] = pspm_get_resp(import) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Test +\end_layout + +\begin_layout Standard +Function name: test(this) +\begin_inset Newline newline +\end_inset + +Description: Test if all fields are returned correctly +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +Test if data.data is equal import.data +\end_layout + +\begin_layout Enumerate +Test if data.header.chantype is β€˜resp’ +\end_layout + +\begin_layout Enumerate +Test if data.header.units is equal import.units +\end_layout + +\begin_layout Enumerate +Test if data.header.sr is equal import.sr +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_scr +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_scr_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data] = pspm_get_scr(import) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Standard +There are three test functions. + One for the case that no transfer parameters are defined, one for the case + that the transfer parameters are defined in a struct and one for the case + that they are defined in a .mat file. + They are all performing the following tests, plus eventually some individual + tests +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +Test if the field data.data exists +\end_layout + +\begin_layout Enumerate +Test if the field data.data is not empty +\end_layout + +\begin_layout Enumerate +Test if the field data.header.units exists +\end_layout + +\begin_layout Enumerate +Test if the field data.header.sr exists +\end_layout + +\begin_layout Enumerate +Test if the field data.header.chantype exists +\end_layout + +\begin_layout Enumerate +Test if data.header.sr is equal import.sr +\end_layout + +\begin_layout Enumerate +Test if data.header.chantype is β€˜scr’ +\end_layout + +\begin_layout Subsubsection* +No transfer parameters +\end_layout + +\begin_layout Standard +Function name: no_transferparams(testCase) +\begin_inset Newline newline +\end_inset + +Description: Test if all fields are returned correctly, if no transfer parameter +s are defined. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Additional Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +No additional tests +\end_layout + +\begin_layout Subsubsection* +Struct transfer parameters +\end_layout + +\begin_layout Standard +Function name: stuct_transferparams(testCase) +\begin_inset Newline newline +\end_inset + +Description: Test if all fields are returned correctly, if the transfer + parameters are defined in a struct. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Additional Tests: +\end_layout + +\begin_layout Enumerate +Check for warning if the conversion constant (import.transfer.c) is not defined +\end_layout + +\begin_layout Enumerate +Checks that there are no warnings if import.transfer.Rs or import.transfer.offset + is not defined. + +\end_layout + +\begin_layout Subsubsection* +File transfer parameters +\end_layout + +\begin_layout Standard +Function name: file_transferparams(testCase) +\begin_inset Newline newline +\end_inset + +Description: Test if all fields are returned correctly, if the transfer + parameters are defined in a .mat file. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Additional Tests: +\end_layout + +\begin_layout Enumerate +Check for warning if the transfer parameter file doesn’t exist. + +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_timing +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_timing_test +\begin_inset Newline newline +\end_inset + +Function: +\begin_inset Newline newline +\end_inset + +[sts, multi] = pspm_get_timing('onsets', intiming, timeunits) +\begin_inset Newline newline +\end_inset + +[sts, events] = pspm_get_timing('markervalues', markerinfo, names) +\begin_inset Newline newline +\end_inset + +[sts, epochs] = pspm_get_timing('epochs', epochs) +\begin_inset Newline newline +\end_inset + +[sts, events] = pspm_get_timing('events', events) +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input arguments +\end_layout + +\begin_layout Standard +Function name: invalid_inputargs(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('epochs') [missing input var] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('onsets', 'str') [no timeunits var] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('foo') [unknown format] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('onsets', intiming, 'samples') [two sessions with nonmatching + number of conditions] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:number_of_elements_dont_match +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('onsets', intiming, 'samples') [two sessions with nonmatching + condition names] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:event_names_dont_match +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('onsets', intiming, 'samples') [intiming.onsets{1} is no + numeric vector] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:no_numeric_vector +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('epochs', fn_mat, 'samples') [epochs is not an integer array] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:no_integers +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('markervalues', markerinfo) [no markervalue and no name + ] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('markervalues', markerinfo, markervalue, names) [markervalue + is not of numeric type nor a cell array] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing('markervalues', markerinfo, markervalue, names) [markervalue + and names are not of the same length] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Case Epochs +\end_layout + +\begin_layout Standard +Function name: case_epochs(this) +\begin_inset Newline newline +\end_inset + +Description: Checks the function in β€˜epochs’ mode. + +\begin_inset Newline newline +\end_inset + +Function: [sts, epochs] = pspm_get_timing('epochs', epochs) +\end_layout + +\begin_layout Subsubsection* +Test 1 (matfile input) +\end_layout + +\begin_layout Standard +Input: mat file with variable: epochs = [1 4; 2 5; 3 6] +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Check if sts==1 and if the return value is equal the input array. + +\end_layout + +\begin_layout Subsubsection* +Test 2 (spm input) +\end_layout + +\begin_layout Standard +Input: mat file with variable: onsets{1} = [1 2 3]';onsets{2} = [4 5 6]'; + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Check if sts==1 and if the return value is equal [onsets{1}, onsets{2}]. + +\end_layout + +\begin_layout Subsubsection* +Test 3 (textfile input) +\end_layout + +\begin_layout Standard +Input: textfile with variable: epochs = [1 4; 2 5; 3 6] +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Check if sts==1 and if the return value is equal the input array. + +\end_layout + +\begin_layout Subsubsection* +Test 4 (matrix input) +\end_layout + +\begin_layout Standard +Input: matrix: epochs = [1 4; 2 5; 3 6] +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Check if sts==1 and if the return value is equal the input array. + +\end_layout + +\begin_layout Subsubsection* +Case onsets +\end_layout + +\begin_layout Standard +Function name: case_onsets(this) +\begin_inset Newline newline +\end_inset + +Description: Checks the function in β€˜onsets’ mode. + +\begin_inset Newline newline +\end_inset + +Function: [sts, multi] = pspm_get_timing('onsets', intiming, timeunits) + +\end_layout + +\begin_layout Subsubsection* +Test 1 +\end_layout + +\begin_layout Standard +Input: mat file with the variables: +\begin_inset Newline newline +\end_inset + +names = {'name1', 'name2'}; +\begin_inset Newline newline +\end_inset + +onsets = {[1 2], [3 4]}; +\begin_inset Newline newline +\end_inset + +pmod.name = {'name3', 'name4'}; +\begin_inset Newline newline +\end_inset + +pmod.param = {[2 3], [4 5]}; +\begin_inset Newline newline +\end_inset + +pmod.poly = {2, 2}; +\begin_inset Newline newline +\end_inset + +save(fn_mat, 'names', 'onsets', 'pmod'); +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Function call: +\begin_inset Newline newline +\end_inset + +[sts, outtiming] = pspm_get_timing('onsets', fn_mat, 'samples'); +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + +Check if sts==1, if onsets and names are unchanged and if +\begin_inset Newline newline +\end_inset + +outtiming.pmod.param == {[2 3], [4 9], [4 5], [16 25]} +\end_layout + +\begin_layout Subsubsection* +Test 2 +\end_layout + +\begin_layout Standard +Input: +\begin_inset Newline newline +\end_inset + +mat file with the variables: names = {'name1', 'name2'}; +\begin_inset Newline newline +\end_inset + +onsets = {[1 2 3], [3 4 5]}; durations = {[3 4 5]', [5 6 7]'}; +\begin_inset Newline newline +\end_inset + +pmod.name = {'name3', 'name4'}; +\begin_inset Newline newline +\end_inset + +pmod.param = {[2 3 4], [4 5 6]}; +\begin_inset Newline newline +\end_inset + +pmod.poly = {2, 1}; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Function call: +\begin_inset Newline newline +\end_inset + +[sts, outtiming] = pspm_get_timing('onsets', fn_mat, 'samples'); +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + +Check if sts==1, if onsets,names and durations are unchanged and if +\begin_inset Newline newline +\end_inset + +outtiming.pmod.param == {[2 3 4], [4 9 16], [4 5 6]} +\end_layout + +\begin_layout Subsubsection* +Case events +\end_layout + +\begin_layout Standard +Function name: case_events(this) +\begin_inset Newline newline +\end_inset + +Description: Checks the function in β€˜events’ mode. + +\begin_inset Newline newline +\end_inset + +Function: [sts, epochs] = pspm_get_timing('events', events) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Check the function if input is a one element cell array and a multiple element + cell array. + Check for warnings (ID:invalid_vector_size) if elements have more than + two columns and if not all elements have the same number of rows. +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_ +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +The datatype import functions are all tested in a similar way. + The individual testclasses must inherit the class β€˜pspm_get_superclass’, + from which they inherit the main test function β€˜valid_datafile’. + They also have to implement the property β€˜fhandle’, which is a function + handle to the specific import function. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The tests are performed with the sampledata files that are listed in the + SampleDataMasterList.docx file (as at 18.11.2013). + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Superclass: pspm_get_superclass +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testclasses: pspm_get_acq_test +\begin_inset Newline newline +\end_inset + +pspm_get_acqmat_test +\begin_inset Newline newline +\end_inset + +pspm_get_biograph_test +\begin_inset Newline newline +\end_inset + +pspm_get_biosemi_test +\begin_inset Newline newline +\end_inset + +pspm_get_biotrace_test +\begin_inset Newline newline +\end_inset + +pspm_get_brainvis_test +\begin_inset Newline newline +\end_inset + +pspm_get_edf +\begin_inset Newline newline +\end_inset + +pspm_get_labchartmat_ext_test +\begin_inset Newline newline +\end_inset + +pspm_get_labchartmat_in_test +\begin_inset Newline newline +\end_inset + +pspm_get_mat_test +\begin_inset Newline newline +\end_inset + +pspm_get_obs_test +\begin_inset Newline newline +\end_inset + +pspm_get_spike_test +\begin_inset Newline newline +\end_inset + +pspm_get_superclass +\begin_inset Newline newline +\end_inset + +pspm_get_txt_test +\begin_inset Newline newline +\end_inset + +pspm_get_vario_test +\begin_inset Newline newline +\end_inset + +pspm_get_eyelink_test +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Function: [sts, import, sourceinfo] = pspm_get_(datafile, import) + +\end_layout + +\begin_layout Subsubsection +Notes +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Subsubsection* +define testcases +\end_layout + +\begin_layout Standard +In this method the testcases are defined and the testdata is generated (if + needed). + Each testcase is a cell in the cellarray β€˜testcases’. + Each testcase has the following fields: +\end_layout + +\begin_layout Itemize +.pth: the path to the samplefile +\end_layout + +\begin_layout Itemize +.import: the input variable +\end_layout + +\begin_layout Standard +For datatypes which support blocks there has to be an additional field: +\end_layout + +\begin_layout Itemize +.numofblocks +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Valid datafile +\end_layout + +\begin_layout Standard +Function name: valid_datafile(this) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Description: The main test function, for tests with valid inputdata. + It tests all testcases equally. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test if β€˜sts’ is equal 1. +\end_layout + +\begin_layout Enumerate +If the datatype supports blocks, test if the number of blocks is correct. +\end_layout + +\begin_layout Enumerate +Test if number of elements of the returned β€˜import’ variable is correct. +\end_layout + +\begin_layout Enumerate +Test if each importjob has a field β€˜data’, that is a numeric vector. +\end_layout + +\begin_layout Enumerate +Test if each importjob has a field β€˜sr’, that is a number. +\end_layout + +\begin_layout Enumerate +Test if each importjob has a field β€˜type’. +\end_layout + +\begin_layout Enumerate +Test if all event importjobs have a field β€˜marker’. +\end_layout + +\begin_layout Enumerate +Test if all importjobs have duration below 1h. +\end_layout + +\begin_layout Enumerate +Test if all importjobs have a samplerate between 1 and 10000 for continuous + channels or between 10^-6 and 1 for timestamp channels. + +\end_layout + +\begin_layout Subsubsection* +invalid datafile +\end_layout + +\begin_layout Standard +Function name: invalid_datafile(this) +\begin_inset Newline newline +\end_inset + +Description: The main test function, for tests with invalid inputdata. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +If the datatype supports multiple channels: Check for warning when trying + to import a channel, that is not contained in the file ('ID:channel_not_contain +ed_in_file'). + +\end_layout + +\begin_layout Subsection +Testcases: pspm_get_acq +\end_layout + +\begin_layout Standard +In this section we describe the testcases specific to pspm_get_acq apart + from generic pspm_get tests. +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_get_acq_test +\begin_inset Newline newline +\end_inset + +Function: [tss, import, sourceinfo] = pspm_get_acq(datafile, import) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +get_acq should return the exact same data as Acqknowledge exported mat file +\end_layout + +\begin_layout Standard +Function name: get_acq_returns_same_data_as_acqknowledge_exported_mat(this) +\begin_inset Newline newline +\end_inset + +Description: The data obtained by using pspm_get_acq should be identical + with the data obtained by using export .mat file functionality in Acqknowledge + software. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Load data stored in +\family typewriter +ImportTestData/acq/impedance_acq.acq +\family default + and +\family typewriter +ImportTestData/acq/impedance_mat.mat +\family default + separately. + Then compare the first channel of +\family typewriter +impedance_mat +\family default + with the first channel of data obtained by calling +\family typewriter +pspm_get_acq +\family default + on +\family typewriter +impedance_acq +\family default +. +\end_layout + +\begin_layout Subsection +Testcases: pspm_glm +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_glm_test +\begin_inset Newline newline +\end_inset + +Function: glm = pspm_glm(model, options) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +There are seven testcase functions. + One invalid input arguments test and test 1 to 6. + Tests 1 to 5 are of the same kind. + There are one or multiple testcases per test function, have a look at the + testcase description for more information. + In these tests only Kronecker delta functions are used as basis functions, + furthermore all conditions, pmods and nuisance regressors are pairwise + orthogonal. + The data is also not down sampled and not filtered. + With these limitations it’s easy to calculate the data vectors and the + expected stats. + For each testcase it is then tested: +\end_layout + +\begin_layout Itemize +If numel(glm.names) has the expected value. +\end_layout + +\begin_layout Itemize +If numel(glm.stats) has the expected value. +\end_layout + +\begin_layout Itemize +If glm.stats has the expected value (with a tolerance of 1%). +\end_layout + +\begin_layout Standard +In test 6 the default basis functions are used, and not all conditions and + pmods are orthogonal. + The data is down sampled and low and high pass filtered. + In exchange the stats are not tested for correct values, just for the correct + number of elements. + The properties 'shiftbf' and 'norm' are TestParameters, which means that + this testclass is parameterized. + All functions implmementing these parameters (Test 1 to Test 5) are called + several times with all the different values and combinations of the mentioned + parameters. +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input arguments +\end_layout + +\begin_layout Standard +Function name: invalid_input (this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) [no timeunits field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) [no timeunits var] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with model.timeunits = β€˜foo’ [no valid timeunits field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with model.timing = zeros(10,2) [no valid timing field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with model.modality = 'foo' [no valid modality field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with model.channel = 'scr' [no valid channel field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with model.norm = 'no' [no valid norm field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with model.filt.down = 'none' [filt.down is not numeric] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with model.bf.fhandle = 'foohandle' [non existing bf] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_fhandle +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with numel(model.datafile) != numel(model.timing) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:number_of_elements_dont_match +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with model.missing is struct [non valid missing field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with numel(model.datafile) != numel(model.missing) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:number_of_elements_dont_match +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with model.nuisance is struct [non valid nuisance field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with numel(model.datafile) != numel(model.nuisance) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:number_of_elements_dont_match +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with no R variable in the nuisance file +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm(model) with R variable in the nuisance file that has not the same + length as the datafile +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:number_of_elements_dont_match +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Test 1 +\end_layout + +\begin_layout Standard +Function name: test1(this, shiftbf) +\begin_inset Newline newline +\end_inset + +Description: Basic test with one basis function, one session, no nuisance + regressors, no missings and one condition. + Timeunits are seconds. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testcases: +\end_layout + +\begin_layout Enumerate +no pmods +\end_layout + +\begin_layout Enumerate +one pmod +\end_layout + +\begin_layout Enumerate +two pmods +\end_layout + +\begin_layout Subsubsection* +Test 2 +\end_layout + +\begin_layout Standard +Function name: test2(this, shiftbf) +\begin_inset Newline newline +\end_inset + +Description: Test with one basis function, one session, no nuisance regressors, + no missings and two conditions. + Timeunits are seconds. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testcases: +\end_layout + +\begin_layout Enumerate +no pmods +\end_layout + +\begin_layout Enumerate +first condition: no pmods; second condition: one pmod +\end_layout + +\begin_layout Enumerate +first condition: one pmod; second condition: two pmods +\end_layout + +\begin_layout Subsubsection* +Test 3 +\end_layout + +\begin_layout Standard +Function name: test3(this, shiftbf) +\begin_inset Newline newline +\end_inset + +Description: Test with one basis function, one session, two nuisance regressors + (1Hz cosinus, 1Hz sinus), no missings, one condition and no pmods. + Timeunits are seconds. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testcases: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Only one testcase. + +\end_layout + +\begin_layout Subsubsection* +Test 4 +\end_layout + +\begin_layout Standard +Function name: test4(this, shiftbf) +\begin_inset Newline newline +\end_inset + +Description: Test with one basis function, two sessions, no nuisance regressors, + no missings and one condition. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testcases: +\end_layout + +\begin_layout Enumerate +timeunits are seconds +\end_layout + +\begin_layout Enumerate +timeunits are samples +\end_layout + +\begin_layout Enumerate +timeunits are markers +\end_layout + +\begin_layout Subsubsection* +Test 5 +\end_layout + +\begin_layout Standard +Function name: test5(this, shiftbf) +\begin_inset Newline newline +\end_inset + +Description: Test with two basis functions, one session, no nuisance regressors + and one condition. + Timeunits are seconds. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testcases: +\end_layout + +\begin_layout Enumerate +no missings +\end_layout + +\begin_layout Enumerate +with missings +\end_layout + +\begin_layout Subsubsection* +Test 6 +\end_layout + +\begin_layout Standard +Function name: test6(this) +\begin_inset Newline newline +\end_inset + +Description: Test with default basis function and non-orthogonal conditions + and pmods +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testcase: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Default basis functions, no nuisance regressors, no missings, two sessions + and two conditions. + Timeunits are seconds. +\end_layout + +\begin_layout Itemize +first condition: two pmods (with pmod(1).poly{1} = 2 and pmod(1).poly{2} = + 3) +\end_layout + +\begin_layout Itemize +second condition: no pmods +\end_layout + +\begin_layout Subsubsection* +Test7: +\end_layout + +\begin_layout Standard +Function name: test_extract_missing(this, cutoff, nan_percent) +\begin_inset Newline newline +\end_inset + +Description: Test with one basis function, one session, no nuisance regressors, + no missings and three conditions. + Timeunits are seconds. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testcases: for all combinations of the test parameters cutoff and nan_percent +\end_layout + +\begin_layout Itemize +glm vector stats_missing has the appropriate length according to the number + of conditions +\end_layout + +\begin_layout Itemize +percentages in glm vector stats_missing contains the expected value +\end_layout + +\begin_layout Itemize +glm vector stats_exclude has the appropriate length according to the number + of conditions +\end_layout + +\begin_layout Itemize +glm vector stats_exclude contains the expected condistion which should be + excluded +\end_layout + +\begin_layout Subsection +Testcases: pspm_import +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_import_test +\begin_inset Newline newline +\end_inset + +Function: outfile = pspm_import(datafile, datatype, import, options) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input arguments +\end_layout + +\begin_layout Standard +Function name: invalid_inputargs(ths) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Test No. +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_import(datafile, datatype) [no import variable] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_import(datafile, datatype, β€˜foo’) [no cell/struct import var.] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_import(datafile, β€˜foo’, import) [invalid channeltype] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_channeltype +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_import(5, datatype, import) [no char filename] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Invalid import variable structure +\end_layout + +\begin_layout Standard +Function name: invalid_import_struct(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the structure of the import variable + is invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Test No. +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Multiple channel, though not supported +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_import_struct +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Not allowed channeltype +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_import_struct +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +No sr given, though autosr is not supported +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_import_struct +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Nonexistent file +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:nonexistent_file +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +One datafile +\end_layout + +\begin_layout Standard +Function name: one_datafile(this) +\begin_inset Newline newline +\end_inset + +Description: Checks the function, if datafile is a string (import of one + datafile) and all inputs are correct. + The outfile is checked with the pspm_load_data function. + The tests are performed with a spike samplefile and a labchartmat_in samplefile + (to check the handling of blocks). + +\end_layout + +\begin_layout Subsubsection* +Multiple datafiles +\end_layout + +\begin_layout Standard +Function name: multiple_datafiles(this) +\begin_inset Newline newline +\end_inset + +Description: Checks the function, if datafile is a cell array of strings + (import of multiple datafiles) and all inputs are correct. + The outfiles are tested with the pspm_load_data function. + +\end_layout + +\begin_layout Subsection +Testcases: pspm_interpolate +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_interpolate_test +\begin_inset Newline newline +\end_inset + +Function: [sts, outdata] = pspm_interpolate(indata, options) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +This test class is parameterized. + The test data is generated by the function itself and when needed, files + will be written to datafile.mat. +\end_layout + +\begin_layout Subsubsection* +Test parameters +\end_layout + +\begin_layout Standard +These are parameters which define what kind of data should be passed to + pspm_interpolate and which options should be set. +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Amount +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Specifies how many elements indata (for pspm_interpolate) should have. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Datatype +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Specifies what type of data should be generated. +\end_layout + +\begin_layout Itemize +struct - a valid data struct will be generated +\end_layout + +\begin_layout Itemize +inline - a numeric vector will be generated +\end_layout + +\begin_layout Itemize +file - a valid scr file will be generated +\end_layout + +\begin_layout Itemize +all - all types will sequentially be generated until amount is reached +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Chans +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +If datatype is not inline this specifies how many and which type of data + channels the generated data should have. + In a second field it also defines which of these channels should be interpolate +d (this will be passed later in options.channels). +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Nan method +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Specifies how NaN values will be put into the data. +\end_layout + +\begin_layout Itemize +start - range is 1+offset: +\end_layout + +\begin_layout Itemize +center - range is : +\end_layout + +\begin_layout Itemize +end - range is :end-offset +\end_layout + +\begin_layout Plain Layout +The offset is 1 if 'extrap' is not defined. + This is needed because if there is no data at the end or beginning of the + data, the function is unable to interpolate (unless extrapolation is activated). +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Extrap +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Is either true or false and activates or deactivates the extrapolation. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Interp method +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Specifies the interpolation method. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Newfile +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +True or false and tells the function to either create a file or add the + data as new channel. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Overwrite +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +True or false and tells the function to either overwrite an existing file + or not. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Replace channel +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +True or false and tells the function to either replace the given channels + with the interpolated data or to add the interpolated data as new channel. +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Test No. +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate() [no arguments] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:missing_data +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate({{}}) [data is not char, struct, numeric] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate({}) [data empty] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:missing_data +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(struct()) [invalid struct] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(invalid_data) [file which does not exist] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:nonexistent_file +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(valid_data, options) [options.channels is larger than valid_data +] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +7 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(valid_data, options) [options.channels is not numeric] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +8 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(valid_data, options) [options.method is invalid] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +9 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(valid_data, options) [options.newfile is invalid] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +10 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(valid_data, options) [options.extrapolate is invalid] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +11 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(valid_data, options) [options.overwrite is invalid] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +12 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(valid_data, options) [options.dont_ask_overwrite is invalid] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +13 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(valid_data, options) [options.replace_channels is invalid] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +14 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(invalid_data, options) [try to interpolate an events channel] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_channeltype +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +15 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(invalid_data) [try to interpolate with nan from beginning + and without extrapolation] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:option_disabled +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +16 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(invalid_data, options) [try to interpolate with nan from + beginning and with extrapolation] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:out_of_range +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +17 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(invalid_data) [try to interpolate with nan from end and + without extrapolation] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:option_disabled +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +18 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate(invalid_data, options) [try to interpolate with nan from + end and with extrapolation] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:out_of_range +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Test datatypes +\end_layout + +\begin_layout Standard +Function name: test_datatypes(this, datatype, amount, chans) +\begin_inset Newline newline +\end_inset + +Description: Tries to interpolate with different datatypes, amount of data, + channels. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with datatype, amount, 'center', chans, false +\end_layout + +\begin_layout Enumerate +Test if function issues no warnings +\end_layout + +\begin_layout Enumerate +Test if sts is 1 +\end_layout + +\begin_layout Enumerate +Test if size of outdata equals the size of the data +\end_layout + +\begin_layout Enumerate +Test if channels to be interpolated have no more NaNs +\end_layout + +\begin_layout Enumerate +Test if channels not to be interpolated still contain NaNs +\end_layout + +\begin_layout Subsubsection* +Test interpolation variations +\end_layout + +\begin_layout Standard +Function name: test_interpolation_variations(this, interp_method, extrap, + nan_method) +\begin_inset Newline newline +\end_inset + +Description: Tries to interpolate with different interpolation methods while + varying options.extrapolate and the nan_method. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with 'inline', 1, nan_method, {{'scr'}, []}, extrap +\end_layout + +\begin_layout Enumerate +Test if function issues no warnings +\end_layout + +\begin_layout Enumerate +Test if sts is 1 +\end_layout + +\begin_layout Enumerate +Test if size of outdata equals the size of the data +\end_layout + +\begin_layout Enumerate +Test if data has no more NaNs +\end_layout + +\begin_layout Standard + +\series bold +\shape italic +Special case: +\series default +\shape default + When extrapolation is on and nan_method is 'start' and interp_method is + 'previous' or nan_method is 'end' and interp_method is 'next'. + This should issue a warning because this is not possible (e.g. + interpolate with previous value when first NaN value is at the beginning + of the data set). +\end_layout + +\begin_layout Enumerate +Generate data as above +\end_layout + +\begin_layout Enumerate +Test if function issues a warning. +\end_layout + +\begin_layout Subsubsection* +Test no nan +\end_layout + +\begin_layout Standard +Function name: test_no_nan(this) +\begin_inset Newline newline +\end_inset + +Description: Test whether function works even if there is nothing to interpolate. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data struct() with pspm_test_data_gen() +\end_layout + +\begin_layout Enumerate +Test if function issues no warnings +\end_layout + +\begin_layout Enumerate +Test if sts is 1 +\end_layout + +\begin_layout Enumerate +Test if size of outdata equals the size of data +\end_layout + +\begin_layout Enumerate +Test if outdata equals data +\end_layout + +\begin_layout Enumerate +Test if data has no NaNs +\end_layout + +\begin_layout Subsubsection* +Test write +\end_layout + +\begin_layout Standard +Function name: test_write(this, newfile) +\begin_inset Newline newline +\end_inset + +Description: Vary the option newfile and test whether new file is created + correctly or data is correctly added to a new channel. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with 'file', 2, 'center', {{'scr', 'scr', 'scr'}, [1,3]} , + false +\end_layout + +\begin_layout Enumerate +Test if function issues no warnings +\end_layout + +\begin_layout Enumerate +Test if sts is 1 +\end_layout + +\begin_layout Enumerate +Test if size of outdata equals the size of data +\end_layout + +\begin_layout Enumerate +Test if outdata does not equal data +\end_layout + +\begin_layout Standard +New files only: +\end_layout + +\begin_layout Enumerate +Test if new file exists +\end_layout + +\begin_layout Enumerate +Load old and new file and test if size of data is equal +\end_layout + +\begin_layout Enumerate +Verify that interpolated channels in the new file are NaN free +\end_layout + +\begin_layout Standard +Added to existing file only: +\end_layout + +\begin_layout Enumerate +Test if all returned values are numeric (new channel ids) +\end_layout + +\begin_layout Enumerate +Verify that the added channels are NaN free +\end_layout + +\begin_layout Enumerate +Test if added channels match the size of the original data channels +\end_layout + +\begin_layout Subsubsection* +Test overwrite +\end_layout + +\begin_layout Standard +Function name: test_overwrite(this, overwrite) +\begin_inset Newline newline +\end_inset + +Description: Vary overwrite and test whether files are overwritten or not. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with 'file', 2, 'center', {{'scr', 'scr', 'scr'}, [1,2,3]}, + false +\end_layout + +\begin_layout Enumerate +Create files with expected filenames +\end_layout + +\begin_layout Enumerate +Test if function issues no warning +\end_layout + +\begin_layout Enumerate +Test if sts is 1 +\end_layout + +\begin_layout Enumerate +According to overwrite test if file has been overwritten or not +\end_layout + +\begin_layout Subsubsection* +Test replace channel +\end_layout + +\begin_layout Standard +Function name: test_replace_channel(this, replace_channels) +\begin_inset Newline newline +\end_inset + +Description: Vary replace_channel and test wether channels are overwritten + or not. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with 'file', 2, 'center', {{'scr', 'scr', 'scr'}, [1,2,3]} + , false +\end_layout + +\begin_layout Enumerate +Test if function issues no warnings +\end_layout + +\begin_layout Enumerate +Test if sts is 1 +\end_layout + +\begin_layout Enumerate +Test if size of outdata equals the size of data +\end_layout + +\begin_layout Enumerate +Test if outdata does not equal data +\end_layout + +\begin_layout Enumerate +According to replace_channel test whether returned channel ids correspond + to replaced channels or correspond to added channels. +\end_layout + +\begin_layout Subsubsection +Other methods +\end_layout + +\begin_layout Subsubsection* +Generate data +\end_layout + +\begin_layout Standard +Has all of the Test parameters as parameter implemented and accordingly + generates the data. + It calls put nan to insert NaN values into the data. + The generated data is returned as data to the calling function. + Also all return values are stored in the property testdata (for cleanup + data). +\end_layout + +\begin_layout Subsubsection* +Cleanup data +\end_layout + +\begin_layout Standard +Sits in MethodTeardown and is called once the test class has finished all + tests. + It then removes all the datafiles which can be found in the property 'testdata'. +\end_layout + +\begin_layout Subsubsection* +Verify NaN free +\end_layout + +\begin_layout Standard +Helper function to verify whether the data is NaN free or not. + It copes with two states. + Either a channel should have been interpolated, then it shouldn't contain + any NaN values or a channel should not have been interpolated, then the + channel should still contain NaN values. +\end_layout + +\begin_layout Subsection +Testcases: pspm_load1 +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_load1_test +\begin_inset Newline newline +\end_inset + +Function: [sts, data, mdltype] = pspm_load1(fn, action, savedata, options) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +The datafile fn is referring to a datafile which was generated with pspm_load1_t +est.generate_testdata(this). + The function is part of the test object and generates models for all of + the available model types (defined in settings.first). + The models are created with data generated with pspm_testdata_gen. + Two files belong to each model: model_.mat (fn) + and dummy_.mat (dfn). + The model file on the one hand is the actual model file while on the other + hand, the dummy file is a copy of the model file, used by the test to manipulat +e the test data. +\end_layout + +\begin_layout Subsubsection* +Generated aquisition data (pspm_testdata_gen) +\end_layout + +\begin_layout Standard + +\family typewriter +data{1}.chantype = 'scr'; +\begin_inset Newline newline +\end_inset + +data{2}.chantype = 'hb'; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family default +The duration of the channels is 100s. +\end_layout + +\begin_layout Subsubsection* +Generated GLM model +\end_layout + +\begin_layout Standard + +\family typewriter +model.timing{1}.names = {'a';'b';'c'}; +\begin_inset Newline newline +\end_inset + +model.timing{1}.onsets = {[10, 20, 30], [15, 25, 35], [18, 28, 38]}; +\end_layout + +\begin_layout Subsubsection* +Generated DCM & SF model +\end_layout + +\begin_layout Standard + +\family typewriter +model.timing{1} = [10,20; 23,38; 40,70;]; +\begin_inset Newline newline +\end_inset + +model.condition{1}.name = {'a';'b'}; +\begin_inset Newline newline +\end_inset + +model.condition{1}.index = [1;2]; +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid model structure (general) +\end_layout + +\begin_layout Standard +Function: invalid_model_tructure_general(this) +\begin_inset Newline newline +\end_inset + +Description: Tries to pass invalid data structures, and tests for certain + warnings. + Applys to all available modeltypes. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +empty model file +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +missing field 'modelfile' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +missing field 'modeltype' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +missing field 'modality' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +missing field 'stats' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +missing field 'names' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Invalid model structure (specific) +\end_layout + +\begin_layout Standard +Function: invalid_model_structure_general(this) +\begin_inset Newline newline +\end_inset + +Description: Tries to pass invalid data structures, and tests for certain + warnings. + Model specific. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests for GLM: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +field 'stats' is not an n x 1 vector +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +unequal amount of numbers and parameters in field 'stats' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.zscored = 1 & action = 'cond' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests for DCM & SF: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +unequal size for fields in 'trlnames' and rows in 'stats' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +missing field 'trlnames' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +unequal size for fields in 'names' and columns in 'stats' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +action = 'recon' +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests for DCM: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.zscored = 1 & pspm_load1(dfn, 'none', {}, options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.zscored = 1 & pspm_load1(dfn, 'cond', {}, options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.zscored = 1 & pspm_load1(dfn, 'stats', {}, options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests for GLM & SF: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.zscored = 1 & pspm_load1(dfn, 'cond', {}, options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Action 'none' +\end_layout + +\begin_layout Standard +Function: test_action_none(this) +\begin_inset Newline newline +\end_inset + +Description: Test for all modeltypes if action 'none' matches the expected + behaviour. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Test if returned data is empty. +\end_layout + +\begin_layout Subsubsection* +Action 'stats' +\end_layout + +\begin_layout Standard +Function: test_action_stats(this) +\begin_inset Newline newline +\end_inset + +Description: Test for all modeltypes if action 'stats' matches the expected + behaviour. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests for all: +\end_layout + +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Returned data contains field 'stats' +\end_layout + +\begin_layout Enumerate +Returned data contains field 'names' +\end_layout + +\begin_layout Standard +Tests for DCM & SF: +\end_layout + +\begin_layout Enumerate +Returned data contains field 'trlnames' +\end_layout + +\begin_layout Enumerate +Returned data contains field 'condnames' +\end_layout + +\begin_layout Subsubsection* +Action 'cond' +\end_layout + +\begin_layout Standard +Function: test_action_cond(this) +\begin_inset Newline newline +\end_inset + +Description: Test for all modeltypes if action 'cond' matches the expected + behaviour. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests for all: +\end_layout + +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Returned data contains field 'stats' +\end_layout + +\begin_layout Enumerate +Returned data contains field 'names' +\end_layout + +\begin_layout Standard +Tests for DCM & SF: +\end_layout + +\begin_layout Enumerate +Returned data contains field 'trlnames' +\end_layout + +\begin_layout Enumerate +Returned data contains field 'condnames' +\end_layout + +\begin_layout Subsubsection* +Action 'recon' +\end_layout + +\begin_layout Standard +Function: test_action_recon(this) +\begin_inset Newline newline +\end_inset + +Description: Test for all modeltypes if action 'recon' matches the expected + behaviour. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests for GLM: +\end_layout + +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Returned data contains field 'stats' +\end_layout + +\begin_layout Enumerate +Returned data contains field 'names' +\end_layout + +\begin_layout Standard +Tests for DCM & SF already done in specific structure test. +\end_layout + +\begin_layout Subsubsection* +Action 'savecon' +\end_layout + +\begin_layout Standard +Function: test_action_savecon(this) +\begin_inset Newline newline +\end_inset + +Description: Test for all modeltypes if action 'savecon' matches the expected + behaviour. + Generates a number, passes it within the 'savecon' struct and tests if + the number is returned correctly. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Returned data contains field 'con' +\end_layout + +\begin_layout Enumerate +Field 'con' contains field 'test' +\end_layout + +\begin_layout Enumerate +Field 'con.test' is equal to the randomly generated number +\end_layout + +\begin_layout Subsubsection* +Action 'con' +\end_layout + +\begin_layout Standard +Function: test_action_con(this) +\begin_inset Newline newline +\end_inset + +Description: Test for all modeltypes if action 'con' matches the expected + behaviour. + Tests if the in 'savecon' generated field test is still returned. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Returned data contains field 'con' +\end_layout + +\begin_layout Enumerate +Field 'con' contains field 'test'. +\end_layout + +\begin_layout Subsubsection* +Action 'all' +\end_layout + +\begin_layout Standard +Function: test_action_all(this) +\begin_inset Newline newline +\end_inset + +Description: Test for all modeltypes if action 'all' matches the expected + behaviour. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Returned data is not empty. +\end_layout + +\begin_layout Subsubsection* +Action 'save' +\end_layout + +\begin_layout Standard +Function: test_action_save(this) +\begin_inset Newline newline +\end_inset + +Description: Test for all modeltypes if action 'save' matches the expected + behaviour. + Test with options.overwrite = 1. + Generates random number and writes it into field 'test' in model structure. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Model structure contains field 'test' +\end_layout + +\begin_layout Enumerate +Field 'test' in model structure equals to the randomly generated number. +\end_layout + +\begin_layout Subsubsection* +Options +\end_layout + +\begin_layout Standard +Function: test_options(this) +\begin_inset Newline newline +\end_inset + +Description: Test for all modeltypes if options passed with options structure + cause the expected behaviour. + Does also work with a randomly generated number in .test to + test whether the data is written or not. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests for all: +\end_layout + +\begin_layout Enumerate +dont_ask_overwrite = 1 & overwrite = 0 returns warning ID:not_saving_data + and field 'test' in model struct does not match generated number +\end_layout + +\begin_layout Enumerate +dont_ask_overwrite = 1 & overwrite = 1 field 'test' in returned model struct + does match generated number +\end_layout + +\begin_layout Standard +Tests for DCM (with dont_ask_overwrite = 1 & overwrite = 1): +\end_layout + +\begin_layout Enumerate +zscored = 0 & action = 'stats' +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Returned data.stats is not zscored +\end_layout + +\end_deeper +\begin_layout Enumerate +zscored = 1 & action = 'stats' +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Returned data.stats is zscored +\end_layout + +\end_deeper +\begin_layout Enumerate +zscored = 0 & action = 'cond' +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Basic function test +\end_layout + +\begin_layout Enumerate +Returned data is different when callng with zscroed = 1 & action = 'cond' + (should not zscore, when not specified) +\end_layout + +\end_deeper +\begin_layout Subsubsection +Other methods +\end_layout + +\begin_layout Subsubsection* +Remove testdata +\end_layout + +\begin_layout Standard +Removes all the test data generated by the test class. + It is called once the class is finished with testing. + +\end_layout + +\begin_layout Subsubsection* +Basic function test +\end_layout + +\begin_layout Standard +Is called in each test after the tested function has been called. + It does two checks: +\end_layout + +\begin_layout Itemize +Returned modeltype matches the modeltype stored in the returned model structure +\end_layout + +\begin_layout Itemize +Returned status (sts) equals 1 +\end_layout + +\begin_layout Subsection +Testcases: pspm_load_data +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_load_data_test +\begin_inset Newline newline +\end_inset + +Function: [sts, infos, data, filestruct] = pspm_load_data(fn, chan) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +If not otherwise declared, the input variable fn is referring to a datafile + which was generated with pspm_testdata_gen and consists out of the following + channels: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family typewriter +data{1}.chantype = 'scr'; +\begin_inset Newline newline +\end_inset + +data{2}.chantype = 'marker'; +\begin_inset Newline newline +\end_inset + +data{3}.chantype = 'hr'; +\begin_inset Newline newline +\end_inset + +data{4}.chantype = 'hb'; +\begin_inset Newline newline +\end_inset + +data{5}.chantype = 'marker'; +\begin_inset Newline newline +\end_inset + +data{6}.chantype = 'resp'; +\begin_inset Newline newline +\end_inset + +data{7}.chantype = 'scr'; +\family default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The duration of the channels is 10s. + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input arguments +\end_layout + +\begin_layout Standard +Function name: invalid_inputargs(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_data [no filename] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_data(1) [no char filename] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_data(fn, -1) [neg. + channel no] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_data(fn, β€˜foobar’) [no allowed ch type] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_data(fn, foo) [missing field in foo struct] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_data(fn, {1}) [invalid channel option] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_data(struct) [struct has no infos field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_data(fn, 250) [nonexisting channel] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Invalid datafile +\end_layout + +\begin_layout Standard +Function name: invalid_datafile(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the datafile is invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Test No. +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +non-existent datafile +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:nonexistent_file +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +missing β€˜infos’ variable +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +missing β€˜data’ variable +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +missing β€˜data’ field in β€˜data{2}’ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +missing β€˜header’ field β€˜data{3}’ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +missing β€˜sr’ field in β€˜data{7}.header’ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +7 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +data{4} is a nx2 vector (instead of a nx1 vector) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +8 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +the length of data{1}.data is incompatible with the duration +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +9 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +An entry of data{2}.data is larger than β€˜duration’ +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +10 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +data{5} has an non-existent chantype (β€˜scanner’) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +11 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +duplicates (9) with struct chan input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Return all channels +\end_layout + +\begin_layout Standard +Function name: valid_datafile_0(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks the function, if all channels shall be returned (chan + = 0). + +\end_layout + +\begin_layout Subsubsection* +Return all channels (struct input) +\end_layout + +\begin_layout Standard +Function name: valid_datafile_1(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks the function, if all channels shall be returned (chan + = 0) and the input is a struct. + +\end_layout + +\begin_layout Subsubsection* +Return one channel +\end_layout + +\begin_layout Standard +Function name: valid_datafile_2(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks the function, if only one channel shall be returned + (chan = 2). + +\end_layout + +\begin_layout Subsubsection* +Return one channel +\end_layout + +\begin_layout Standard +Function name: valid_datafile_3(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks the function, if multiple channels shall be returned + (chan = [3 5]). + +\end_layout + +\begin_layout Subsubsection* +Return scr channels +\end_layout + +\begin_layout Standard +Function name: valid_datafile_4(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks the function, if only the scr channels shall be returned. + +\end_layout + +\begin_layout Subsubsection* +Return event channels +\end_layout + +\begin_layout Standard +Function name: valid_datafile_5(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks the function, if only the event channels shall be returned. + +\end_layout + +\begin_layout Subsubsection* +Save data +\end_layout + +\begin_layout Standard +Function name: valid_datafile_6(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks the function, if data is to be saved (chan struct). + +\end_layout + +\begin_layout Subsection +Testcases: pspm_pp +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_pp_test +\begin_inset Newline newline +\end_inset + +Function: newfile = pspm_pp('median', datafile, n, channelnumber) or newfile + = pspm_pp('butter', datafile, freq, channelnumber) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pp('butter', 'file') [no freq] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pp('foo', 'file', 100) [no valid first argument] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pp('butter', 'file', 19) [freq below 20] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Median test +\end_layout + +\begin_layout Standard +Function name: median_test(this) +\begin_inset Newline newline +\end_inset + +Description: Checks medianfilter functionality +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Setup: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testfile with 3 channels (scr, hb, scr). +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Filter one channel [Input: newfile = pspm_pp('median', testfile, 50, 3)] + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Standard +i. + Check if sts == 1, when data is loaded with pspm_load_data. + +\end_layout + +\begin_layout Standard +ii. + Check if newfile has the same number of channels as testfile +\end_layout + +\end_deeper +\begin_layout Enumerate +Filter multiple channel [Input: newfile = pspm_pp('median', testfile, 50)] + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Standard +i. + Check if sts == 1, when data is loaded with pspm_load_data. + +\end_layout + +\begin_layout Standard +ii. + Check if newfile has the same number of channels as testfile +\end_layout + +\end_deeper +\begin_layout Subsubsection* +Butterworth filter test +\end_layout + +\begin_layout Standard +Function name: butter_test(this) +\begin_inset Newline newline +\end_inset + +Description: Checks Butterworth filter functionality +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Setup: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Testfile with 3 channels (scr, hb, scr). + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Filter one channel [Input: newfile = pspm_pp('butter', testfile, 40, 3)] + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Standard +i. + Check if sts == 1, when data is loaded with pspm_load_data. + +\end_layout + +\begin_layout Standard +ii. + Check if newfile has the same number of channels as testfile +\end_layout + +\end_deeper +\begin_layout Enumerate +Filter multiple channel [Input: newfile = pspm_pp('butter', testfile, 40)] + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Standard +i. + Check if sts == 1, when data is loaded with pspm_load_data. + +\end_layout + +\begin_layout Standard +ii. + Check if newfile has the same number of channels as testfile +\end_layout + +\end_deeper +\begin_layout Subsection +Testcases: pspm_prepdata +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_prepdata_test +\begin_inset Newline newline +\end_inset + +Function: [sts, outdata, newsr] = pspm_prepdata(data, filt) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_prepdata([1 NaN 3], filt) [no NaN values] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_prepdata([1 2 3]) [no filt variable] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_prepdata(data, filt) [filt has no hporder field] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_prepdata('foo', filt) [no numeric data] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_prepdata(data, filt) [with lpfreq = 'foo' (not valid)] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Hipassfilter test +\end_layout + +\begin_layout Standard +Function name: hipassfilter_test(this) +\begin_inset Newline newline +\end_inset + +Description: Checks hipassfilter functionality (without downsampling) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Setup: +\begin_inset Newline newline +\end_inset + +data = rand(1000,1); +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +filt.sr = 100; +\begin_inset Newline newline +\end_inset + +filt.lpfreq = 'none'; +\begin_inset Newline newline +\end_inset + +filt.lporder = 1; +\begin_inset Newline newline +\end_inset + +filt.hpfreq = 20; +\begin_inset Newline newline +\end_inset + +filt.hporder = 1; +\begin_inset Newline newline +\end_inset + +filt.down = 'none'; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Unidirectional tests [filt.direction = β€˜uni’] +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Standard +i. + Check if sts == 1 +\end_layout + +\begin_layout Standard +ii. + Check if newsr == filt.sr +\end_layout + +\begin_layout Standard +iii. + Check if outdata is empty +\end_layout + +\begin_layout Standard +iv. + Check if length(outdata) == length(data) +\end_layout + +\end_deeper +\begin_layout Enumerate +Unidirectional tests [filt.direction = β€˜bi’] +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Standard +i. + Check if sts == 1 +\end_layout + +\begin_layout Standard +ii. + Check if newsr == filt.sr +\end_layout + +\begin_layout Standard +iii. + Check if outdata is empty +\end_layout + +\begin_layout Standard +iv. + Check if length(outdata) == length(data) +\end_layout + +\end_deeper +\begin_layout Subsubsection* +Lowpassfilter test +\end_layout + +\begin_layout Standard +Function name: lowpassfilter_test(this) +\begin_inset Newline newline +\end_inset + +Description: Checks hipassfilter functionality (without downsampling) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Setup: +\begin_inset Newline newline +\end_inset + +data = rand(1000,1); +\begin_inset Newline newline +\end_inset + +filt.sr = 100; +\begin_inset Newline newline +\end_inset + +filt.lpfreq = 40; +\begin_inset Newline newline +\end_inset + +filt.lporder = 1; +\begin_inset Newline newline +\end_inset + +filt.hpfreq = 'none'; +\begin_inset Newline newline +\end_inset + +filt.hporder = 1; +\begin_inset Newline newline +\end_inset + +filt.down = 'none'; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Same tests as in hipassfilter_test. + Additionally there is a check for a warning if filt.lpfreq is higher (or + equal) than the nyquist frequency: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_prepdata(data, filt) [filt.sr = 100; filt.lpfreq = 60] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:no_low_pass_filtering +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Bandpassfilter test +\end_layout + +\begin_layout Standard +Function name: bandpassfilter_test(this) +\begin_inset Newline newline +\end_inset + +Description: Checks bandpassfilter functionality (without downsampling) + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Setup: +\begin_inset Newline newline +\end_inset + +data = rand(1000,1); +\begin_inset Newline newline +\end_inset + +filt.sr = 200; +\begin_inset Newline newline +\end_inset + +filt.lpfreq = 99; +\begin_inset Newline newline +\end_inset + +filt.lporder = 1; +\begin_inset Newline newline +\end_inset + +filt.hpfreq = 20; +\begin_inset Newline newline +\end_inset + +filt.hporder = 1; +\begin_inset Newline newline +\end_inset + +filt.down = 'none'; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: Same tests as in hipassfilter_test. + +\end_layout + +\begin_layout Subsubsection* +Integer samplerate ratio downsampling test +\end_layout + +\begin_layout Standard +Function name: int_sr_ratio_downsample_test(this) +\begin_inset Newline newline +\end_inset + +Description: Checks downsampling functionality, if the ratio between filt.sr + and filt.down is an integer. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Setup: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +ratio = 2; %ratio between filt.sr and filt.down +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +filt.down = 100; +\begin_inset Newline newline +\end_inset + +filt.sr = ratio +\begin_inset Newline newline +\end_inset + +filt.down; filt.lpfreq = 40; +\begin_inset Newline newline +\end_inset + +filt.lporder = 1; +\begin_inset Newline newline +\end_inset + +filt.hpfreq = 'none'; +\begin_inset Newline newline +\end_inset + +filt.hporder = 1; +\begin_inset Newline newline +\end_inset + +filt.direction = 'uni'; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +data = rand(filt.sr * 10,1); +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Check if sts == 1 +\end_layout + +\begin_layout Enumerate +Check if newsr == filt.down +\end_layout + +\begin_layout Enumerate +Check if outdata is empty +\end_layout + +\begin_layout Enumerate +Check if ratio*length(outdata) == length(data) +\end_layout + +\begin_layout Subsection +Testcases: pspm_process_illuminance +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_process_illuminance_test +\begin_inset Newline newline +\end_inset + +Function: [sts, out] = pspm_process_illuminance(ldata, sr, options) +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +This test class is parameterized. + The test data is generated by the function itself and when needed, files + will be written to datafile.mat. +\end_layout + +\begin_layout Subsubsection* +Test parameters +\end_layout + +\begin_layout Standard +These are parameters which define what kind of data should be passed to + pspm_process_illuminance and which options should be set. +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +bf_dur +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines the duration of the basis function. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +bf_offset +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines the offset of the basis function. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +dur +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines the duration of the generated dataset. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +sr +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines the samplerate of the generated dataset. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +n_times +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines how many datasets should be generated. +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +mode +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines the whether the dataset should be written to a file, kept as inline + variable or should be a mix of both. + Can be either 'file', 'inline' or 'mixed' +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +overwrite +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Defines whether existing files should be overwritten or not. +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Test No. +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance() [no arguments] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance([]) [empty data] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:missing_data +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance(1:10) [missing samplerate] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance(1:10, 'a') [invalid ssamplerate] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +5 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10}, 1) [cell, no cell] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +6 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance(1:10, {1}) [no cell, cell] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +7 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10, 10:10}, {1}) [different sized cells] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +8 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10, 'a'},{1,2}) [invalid file] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:non_existent_file +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +9 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10, 1:10}, {1, 'a'}) [invalid samplerate] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +10 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10}, {1}, 'o') [wrong options] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +11 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10}, {1}, opt)[wrong transfer settings] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +12 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10}, {1}, opt)[wrong duration] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +13 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10}, {1}, opt)[wrong offset] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +14 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10}, {1}, opt)[wrong outputfile] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +15 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10}, {1}, opt)[format of ldata and opt.fn differs] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +16 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance({1:10}, {1}, opt)[opt.overwrite is not boolean] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Test options +\end_layout + +\begin_layout Standard +Function name: test_options(this, sr, dur, bf_dur, bf_offset) +\begin_inset Newline newline +\end_inset + +Description: Tries out different combination options to process the generated + illuminance data. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with sr and dur +\end_layout + +\begin_layout Enumerate +Set options according to bf_dur and bf_offset +\end_layout + +\begin_layout Enumerate +Set expected warning according to sr*dur and sr*bf_dur +\end_layout + +\begin_deeper +\begin_layout Enumerate +expect empty data if sr*dur < 1 +\end_layout + +\begin_layout Enumerate +expect invalid_input if sr*bf_dur < 1 +\end_layout + +\begin_layout Enumerate +otherwise expect no warning +\end_layout + +\end_deeper +\begin_layout Enumerate +Test if issued warning equals expected warning +\end_layout + +\begin_layout Enumerate +Test if sts equals expected value +\end_layout + +\begin_layout Enumerate +Test if amount of data elements of input and output data is equal +\end_layout + +\begin_layout Subsubsection* +Test multi +\end_layout + +\begin_layout Standard +Function name: test_multi(this, n_times, mode) +\begin_inset Newline newline +\end_inset + +Description: Generates n sets of illuminance data and passes it to pspm_process_ +illuminance. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with 10 (sr), 100 (dur), n_times (amount), mode +\end_layout + +\begin_layout Enumerate +Test if pspm_process_illuminance issues no warning +\end_layout + +\begin_layout Enumerate +Test if sts is 1 +\end_layout + +\begin_layout Enumerate +For n_times == 1, test if out has 10*100 data points +\end_layout + +\begin_layout Enumerate +for n_times +\begin_inset space \space{} +\end_inset + +~= 1, test if output has same size as input +\end_layout + +\begin_layout Subsubsection* +Test overwrite +\end_layout + +\begin_layout Standard +Function name: test_overwrite(this, overwrite) +\begin_inset Newline newline +\end_inset + +Description: Generate illuminance file and test overwrite behaviour. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Generate data with 10 (sr), 100 (dur), 1 (amount), 'file' +\end_layout + +\begin_layout Enumerate +Test if pspm_process_illuminance issues no warning +\end_layout + +\begin_layout Enumerate +Test if sts equals 1 +\end_layout + +\begin_layout Enumerate +Test if existing file was overwriten or not +\end_layout + +\begin_layout Subsubsection +Other methods +\end_layout + +\begin_layout Subsubsection* +Generate lx +\end_layout + +\begin_layout Standard +Has some of the Test parameters as parameter implemented and accordingly + generates the lx data. + According to the calling arguments the output is a cell of files and data + vectors. + All generated files will be stored in the property 'datafiles'. + They will be removed once all tests have finished. +\end_layout + +\begin_layout Subsubsection* +Cleanup +\end_layout + +\begin_layout Standard +Located in MethodTeardown and is called once the test class has finished + all tests. + It then removes all the datafiles which can be found in the property 'datafiles +'. +\end_layout + +\begin_layout Subsection +Testcases: pspm_pulse_convert +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_pulse_convert_test +\begin_inset Newline newline +\end_inset + +Function: wavedata = pspm_pulse_convert(pulsedata, resamplingrate, samplingrate) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(testCase) +\begin_inset Newline newline +\end_inset + +Description: Pass invalid input arguments and test if the error message + is correct. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pulse_convert() +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pulse_convert(10^-3 * (1:10000)') +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pulse_convert(10^-3 * (1:10000)', 10000) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Valid input +\end_layout + +\begin_layout Standard +Function name: valid_input(testCase) +\begin_inset Newline newline +\end_inset + +Description: Pass generated, valid data and test if function issues no warning. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Test function without downsampling the data +\end_layout + +\begin_layout Enumerate +Test function with downsampling the data +\end_layout + +\begin_layout Subsection +Testcases: pspm_ren +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_ren_test +\begin_inset Newline newline +\end_inset + +Function: out_newfilename = pspm_ren(filename, newfilename) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input (this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ren('fn') [no newfilename] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ren({'fn1', 'fn2'}, {'rfn1', 'rfn2', 'rfn3'}) [non same size cell arrays] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Char Valid Input +\end_layout + +\begin_layout Standard +Function name: char_valid_input (this) +\begin_inset Newline newline +\end_inset + +Description: Checks the function if the input variables are of type char. + It uses pspm_load_data to check the files. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Check if out_newefilename = newfilename +\end_layout + +\begin_layout Enumerate +Check if sts==1 (of pspm_load_data output) +\end_layout + +\begin_layout Enumerate +Check if the field β€˜infos.rendata’ exists +\end_layout + +\begin_layout Enumerate +Check if the field β€˜infos.newname’ exists +\end_layout + +\begin_layout Enumerate +Check if the original file has been deleted +\end_layout + +\begin_layout Subsubsection* +Cell Valid Input +\end_layout + +\begin_layout Standard +Function name: cell_valid_input (this) +\begin_inset Newline newline +\end_inset + +Description: Checks the function if the input variables are of type cell. + It uses pspm_load_data to check the files. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The inputs are two-element cell arrays. + For both elements the same tests as in the char_valid_input function are + performed individually. +\end_layout + +\begin_layout Subsection +Testcases: pspm_resp_pp +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_resp_pp_test +\begin_inset Newline newline +\end_inset + +Function: sts = pspm_resp_pp(fn, sr, chan, options) +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Regression Test against Revision r660 +\end_layout + +\begin_layout Standard +Function name: compare_results_to_results_obtained_from_r660_version(this) +\begin_inset Newline newline +\end_inset + +Description: In r660, there was a bug found in pspm_resp_pp that caused + it to crash with index out of bounds error on inputs containing some edgecase. + This test specifically checks whether the fixed version returns the same + results as the version before the bugfix on data that didn't cause a crash. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Check if the returned channel types have the same name and ordering +\end_layout + +\begin_layout Enumerate +Check if the returned data is the same +\end_layout + +\begin_layout Subsection +Testcases: pspm_split_sessions +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_split_sessions_test +\begin_inset Newline newline +\end_inset + +Properties: expected_number_of_files = 3; +\begin_inset Newline newline +\end_inset + +Function: newdatafile = pspm_split_sessions(datafile, markerchannel, options) + +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +For the tests a testdatafile with three channels is used (duration is 100s). + The markerchannel data is: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +data = [1 4 9 12 30 31 34 41 43 59 65 72 74 80 89 96]' +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Hence if MAXSN=10 & BRK2NORM=3 (default values) the datafiles should be + split into 3 files. + If different values are being used, update the property β€˜expected_number_of_fil +es’ of the testclass object accordingly. + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input (this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_split_sessions() [no filename] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_split_sessions (2) [no string filename] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_split_sessions (β€˜fn’, β€˜foo’) [no numeric marker channel no.] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +One datafile +\end_layout + +\begin_layout Standard +Function name: one_datafile(this) +\begin_inset Newline newline +\end_inset + +Description: Checks the function if the variable β€˜datafile’ is of type char + (one datafile). + The markerchannel number is not assigned explicitly. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Check if the file has been split into β€˜expected_number_of_files’ files For + each output file the following tests are performed: +\end_layout + +\begin_layout Enumerate +Check if sts == 1, when data is loaded with pspm_load_data. +\end_layout + +\begin_layout Enumerate +Check if number of channels is correct. +\end_layout + +\begin_layout Enumerate +Check it the field infos.slitdate exists +\end_layout + +\begin_layout Enumerate +Check if the field infos.splitsn exists +\end_layout + +\begin_layout Enumerate +Check if the field infos.splitfile exists. + +\end_layout + +\begin_layout Subsubsection* +Multiple datafiles +\end_layout + +\begin_layout Standard +Function name: multiple_datafiles(this) +\begin_inset Newline newline +\end_inset + +Description: Checks the function if the variable β€˜datafile’ is of type cell + (two datafiles). + The markerchannel number is assigned explicitly. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +For both datafiles the same tests as in the one_datafile function are performed + individually. + Additionally it is tested if the number of input files does match the number + of output files. + +\end_layout + +\begin_layout Subsection +Testcases: pspm_trim +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_trim_test +\begin_inset Newline newline +\end_inset + +Function: newdatafile=pspm_trim(datafile, from, to, reference, options) + +\end_layout + +\begin_layout Subsubsection +Setup +\end_layout + +\begin_layout Standard +If not otherwise declared, the input variable fn is referring to a datafile + which was generated with pspm_testdata_gen and consists of the following + channels: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +data{1}.chantype = 'scr'; +\begin_inset Newline newline +\end_inset + +data{2}.chantype = 'marker'; +\begin_inset Newline newline +\end_inset + +data{3}.chantype = 'hr'; +\begin_inset Newline newline +\end_inset + +data{4}.chantype = 'hb'; +\begin_inset Newline newline +\end_inset + +data{5}.chantype = 'marker'; +\begin_inset Newline newline +\end_inset + +data{6}.chantype = 'resp'; +\begin_inset Newline newline +\end_inset + +data{7}.chantype = 'scr'; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The duration of the data recording is 10s. + +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input arguments +\end_layout + +\begin_layout Standard +Function name: invalid_inputargs(testCase) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\begin_inset Newline newline +\end_inset + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_trim(testCase.fn, [1 2], 5, 'marker') [invalid from parameter] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_trim(testCase.fn, 0, 'bla', 'marker') [invalid to parameter] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_trim(testCase.fn, 0, '[]', 'marker') [invalid to parameter] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_trim(fn, 0, 5) [no reference] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_trim(fn, 0, 5, 6) [no char or 2-element numeric reference] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_trim(fn, 0, 5, β€˜bla’) [invalid char reference] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_trim(fn, 0, 5, [-1 5]) [invalid numeric start reference] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_trim(fn, 0, 5, [5 4]) [invalid numeric start/end reference] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Reference = β€˜marker’ tests +\end_layout + +\begin_layout Standard +Function name: marker_tests(testCase) +\begin_inset Newline newline +\end_inset + +Description: A wrapper function for tests with reference = β€˜marker’. + It executes the methods markertest_k, where the testcases are defined. + +\end_layout + +\begin_layout Subsubsection* +markertest_1 +\end_layout + +\begin_layout Standard +Description: from and to are set so that the trimming points are out of + the range [0,duration]. + Hence the data should not be trimmed. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Expected warning: ID: marker_out_of_range +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Input: pspm_trim(fn, -20, 20, ’marker’) +\end_layout + +\begin_layout Subsubsection* +markertest_2 +\end_layout + +\begin_layout Standard +Description: from and to are set so that the trimming points are exactly + (0, duration). + Hence the data should not be trimmed. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Input: from = -1 * marker(1) to = duration - marker(end) pspm_trim(fn, from, + to, ’marker’) +\end_layout + +\begin_layout Subsubsection* +markertest_3 +\end_layout + +\begin_layout Standard +Description: from and to are set so that the trimming points in the range + [0,duration]. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Input: pspm_trim(fn, 1, -2, ’marker’) +\end_layout + +\begin_layout Subsubsection +Reference = β€˜file’ tests +\end_layout + +\begin_layout Standard +Function name: file_tests(testCase) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Description: A wrapper function for tests with reference = β€˜file’. + It executes the methods filetest_k, where the testcases are defined. + +\end_layout + +\begin_layout Subsubsection* +filetest_1 +\end_layout + +\begin_layout Standard +Description: from and to are set so that the trimming points are out of + the range [0,duration]. + Hence the data should not be trimmed. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Expected warning: ID: marker_out_of_range +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Input: pspm_trim(fn, -12.5, 50, ’marker’) +\end_layout + +\begin_layout Subsubsection* +filetest_2 +\end_layout + +\begin_layout Standard +Description: from and to are set so that the trimming points are exactly + (0, duration). + Hence the data should not be trimmed. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Input: pspm_trim(fn, 0 , duration, ’marker’) +\end_layout + +\begin_layout Subsubsection* +filetest_3 +\end_layout + +\begin_layout Standard +Description: from and to are set so that the trimming points in the range + [0,duration]. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Input: pspm_trim(fn,2.1, duration – 2.5, ’marker’) +\end_layout + +\begin_layout Subsubsection* +Numeric reference tests +\end_layout + +\begin_layout Standard +Function name: num_tests(testCase) +\begin_inset Newline newline +\end_inset + +Description: A wrapper function for tests with reference = [a b] (a, b are + two integers with a + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_write_channel() [no parameter] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_write_channel(1) [fn is a number] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_write_channel('some_file', []) [no action passed] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:unknown_action +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_write_channel('some_file', [], '') [empty action passed] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:unknown_action +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.channel = 'some invalid channel' +\end_layout + +\begin_layout Plain Layout +pspm_write_channel('some_file', [], 'add', options) [invalid channel] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.channel = -1 +\end_layout + +\begin_layout Plain Layout +pspm_write_channel('some_file', [], 'add', options) [negative channel] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.channel = 0 +\end_layout + +\begin_layout Plain Layout +pspm_write_channel('some_file', [], 'delete', options) [no channel and no + data given] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.channel = 0 +\end_layout + +\begin_layout Plain Layout +pspm_write_channel('some_file', [], 'add', options) [empty newdata] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.channel = 0 +\end_layout + +\begin_layout Plain Layout +pspm_write_channel('some_file', 1:3, 'add', options) [newdata is not cell + and not struct] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.channel = 1:5 +\end_layout + +\begin_layout Plain Layout +pspm_write_channel(this.testdatafile, [], 'delete', options) [more given + channels than in file exist] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +options.channel = 'ecg'; pspm_write_channel(this.testdatafile, [], 'delete', + options) +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:no_matching_channels +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_write_channel(this.testdatafile, gen_data.data{1}, 'add') [generated + data has the wrong format (two rows in one channel)] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_data_structure +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\begin_layout Subsubsection* +Action 'add' +\end_layout + +\begin_layout Standard +Function name: test_add(this) +\begin_inset Newline newline +\end_inset + +Description: Checks if action 'add' behaves as expected. + A new channel with chantype = 'hb', sr = 200 and duration = 500 is generated. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Load condition before and after and pass it to 'Verify write' +\end_layout + +\begin_layout Subsubsection* +Action 'add transposed' +\end_layout + +\begin_layout Standard +Function name: test_add_transposed(this) +\begin_inset Newline newline +\end_inset + +Description: Checks if action 'add' behaves as expected, when data has the + wrong dimensions. + A new channel with chantype = 'rs', sr = 200 and duration = 500 is generated. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Transpose generated data +\end_layout + +\begin_layout Enumerate +Load condition before and after and pass it to 'Verify write' +\end_layout + +\begin_layout Subsubsection* +Action 'replace'/'add' +\end_layout + +\begin_layout Standard +Function name: test_replace_add(this) +\begin_inset Newline newline +\end_inset + +Description: Checks if action 'replace' behaves as expected. + A new channel with chantype = 'hr', sr = 10 and duration = 500 is generated. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Running pspm_write_channel with action = 'replace' should issue 'ID:no_matching_ +channels' (channeltype should not exist before) and then instead add the + channel +\end_layout + +\begin_layout Enumerate +Load condition before and after and pass it to 'Verify write' +\end_layout + +\begin_layout Subsubsection* +Action 'replace' +\end_layout + +\begin_layout Standard +Function name: test_replace(this) +\begin_inset Newline newline +\end_inset + +Description: Checks if action 'replace' behaves as expected. + A new channel with chantype = 'hr', sr = 20 and duration = 500 is generated. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Load condition before and after and pass it to 'Verify write' +\end_layout + +\begin_layout Enumerate +Test if 'hr' channel has sample rate 20 +\end_layout + +\begin_layout Subsubsection* +Action 'delete' (one channel) +\end_layout + +\begin_layout Standard +Function name: test_delete_single(this) +\begin_inset Newline newline +\end_inset + +Description: Checks if action 'delete' behaves as expected. + In this test only one channel will be deleted. + To test the delete algorithm there will be 7 channels added which are then + also used for test_delete_multi(this). + The particular channels are then identified by the sample rate which correspond +s to the channel id * 10. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Delete channel with chantype = 'hr' in newdata.header.chantype +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Verify write +\end_layout + +\begin_layout Enumerate +Ensure only one channel has been deleted +\end_layout + +\begin_layout Enumerate +Test if there is no more channel with chantype = 'hr' +\end_layout + +\end_deeper +\begin_layout Enumerate +Delete channel with channel number in options.channel +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Verify Write +\end_layout + +\begin_layout Enumerate +Ensure only one channel has been deleted +\end_layout + +\end_deeper +\begin_layout Enumerate +Test the delete algorithm +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Remove 'resp' channel with options.delete = 'last' +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Verify write +\end_layout + +\begin_layout Enumerate +Ensure only one channel has been deleted +\end_layout + +\begin_layout Enumerate +Test if last channel was deleted +\end_layout + +\end_deeper +\begin_layout Enumerate +Remove 'resp' channel with options.delete = 'first' +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Verify write +\end_layout + +\begin_layout Enumerate +Ensure only one channel has been deleted +\end_layout + +\begin_layout Enumerate +Test if last entry was not deleted +\end_layout + +\end_deeper +\end_deeper +\begin_layout Subsubsection* +Action 'delete' (multiple channels) +\end_layout + +\begin_layout Standard +Function name: test_delete_multi(this) +\begin_inset Newline newline +\end_inset + +Description: Checks if action 'delete' behaves as expected. + In this test only multiple channels will be deleted. + This test relys on the changes made to the testdatafile by other test functions + in this class. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +Delete channel 1 and 2 from testdatafile +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Verify write +\end_layout + +\begin_layout Enumerate +Ensure two channels have been deleted +\end_layout + +\end_deeper +\begin_layout Enumerate +Delete all 'resp' channels from testdatafile +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +Verify write +\end_layout + +\begin_layout Enumerate +Test if datafile contains no more 'resp' channels +\end_layout + +\end_deeper +\begin_layout Subsubsection +Other methods +\end_layout + +\begin_layout Subsubsection* +Verify write +\end_layout + +\begin_layout Standard +Is called after pspm_write_channel has been called (action = 'add' or action + = 'replace') and tests if data was written and a new history entry was + made. + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Enumerate +if action = 'add', test if there is a new channel +\end_layout + +\begin_layout Enumerate +if action = 'replace', test if there is still the same amount of channels +\end_layout + +\begin_layout Enumerate +if action = 'delete', test if there have been as many channels deleted as + given in outinfos.channel +\end_layout + +\begin_layout Enumerate +test if history has a new entry +\end_layout + +\begin_layout Enumerate +search for channels with same chantype as added channel (should be only + one channel) +\end_layout + +\begin_layout Enumerate +test if number of data elements in new channel and added channel is equal +\end_layout + +\begin_layout Enumerate +test if new channel and added channel have same 'sr' +\end_layout + +\begin_layout Section +External functions and tools +\end_layout + +\begin_layout Subsection +VB (Variational Bayes) inversion algorithm by Jean Daunizeau +\end_layout + +\begin_layout Standard +Updated October 2014 +\end_layout + +\begin_layout Standard +Changes made for use in PsPM: +\end_layout + +\begin_layout Itemize + +\emph on +VBA_ReDisplay.m +\emph default +, fixed try-catch syntax in various places by adding a comma after +\begin_inset Quotes eld +\end_inset + +try +\begin_inset Quotes erd +\end_inset + + to avoid warning in matlab > 2007 +\end_layout + +\begin_layout Itemize + +\shape italic +VBA_inv.m +\shape default +, line 42: added warning off/on to suppress the warning +\begin_inset Quotes eld +\end_inset + +Matrix is singular, close to singular or badly scaled. + Results may be inaccurate. + RCOND = NaN. +\begin_inset Quotes erd +\end_inset + + +\end_layout + +\begin_layout Standard +Updated October 2016 +\end_layout + +\begin_layout Standard +Changes made for use in PsPM: +\end_layout + +\begin_layout Itemize + +\emph on +VBA_ReDisplay.m +\emph default +, fixed try-catch syntax in various places by adding a comma after +\begin_inset Quotes eld +\end_inset + +try +\begin_inset Quotes erd +\end_inset + + to avoid warning in matlab > 2007 +\end_layout + +\begin_layout Itemize + +\shape italic +VBA_inv.m +\shape default +, line 48: added warning off/on to suppress the warning +\begin_inset Quotes eld +\end_inset + +Matrix is singular, close to singular or badly scaled. + Results may be inaccurate. + RCOND = NaN. +\begin_inset Quotes erd +\end_inset + + +\end_layout + +\begin_layout Itemize + +\shape italic +VBA_NLStateSpaceModel.m +\shape default +: added resetting warning to preceeding state. +\end_layout + +\begin_layout Section +List of functions +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Name +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Main author +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Test exists +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Test Doc +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +f_SCR +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach & Jean Daunizeau +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +f_SF +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +g_SCR +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +scr +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_align_channels +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_axpos +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_brf +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Saurabh Khemka & Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_FIR +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_Fourier +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_hprf +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_hprf_e +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_hprf_fc +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_hprf_fc_f +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_lcrf_gm +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_ldrf_gm +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_ldrf_gu +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_psrf_fc +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_rarf_e +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_rarf_fc +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_rfrrf_e +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_rprf_e +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_scrf_f +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_scrf +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_spsrf_box +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Laure Ciernik +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_bf_spsrf_gamma +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Laure Ciernik +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_butter +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_compute_visual_angle +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Laure Ciernik +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_con1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_con2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_contrast +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_convert_area2diameter +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_convert_au2mm +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_convert_illum2lum +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_convert_lux2cdm2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_convert_mm2visdeg +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_convert_pixel2unit +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Laure Ciernik +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_convert_unit +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_convert_visangle2sps +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Laure Ciernik +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_data_editor +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_dcm_inv +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_dcm +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_denoise_spike +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_display +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Philipp C Paulus +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_down +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_downsample +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ecg2hb +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Philipp C Paulus +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ecg2hb_amri +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ecg_editor +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_exp +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_extract_segments +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_filtfilt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_channel +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_data_epochs +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_sounds +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Samuel Gerster +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_find_valid_fixations +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_acq_bioread +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_acq +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_acqmat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_biograph +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_biosemi +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_biotrace +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_blink_l +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_blink_r +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_brainvis +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_cell +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_cnt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_custom +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_ecg +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_edf +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_events +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_eyelink +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Christoph Korn, Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_gaze_x_l +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_gaze_y_l +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_gaze_x_r +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_gaze_y_r +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_hb +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_hp +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_hr +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_labchartmat_ext +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_labchartmat_in +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_marker +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_markerinfo +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_mat +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_obs +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Linus RΓΌttimann +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_physlog +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_pupil +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_pupil_l +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_pupil_r +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_resp +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_rf +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_saccade_l +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Laure Ciernik +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_saccade_r +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Laure Ciernik +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_scr +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_smi +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_sp_speed +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Laure Ciernik +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_spike +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_sound +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_timing +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_txt +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_vario +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_viewpoint +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_wdq +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_get_wdq_n +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm_recon +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_glm +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hp +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hr +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_import +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_init +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_interpolate +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_jobman +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Gabriel GrΓ€ni +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_job_create +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_data +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load1 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_load_single_chan +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_merge +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_path +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_peakscore +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pp +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ppu2hb +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Samuel Gerster +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_predval +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_prepdata +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_process_illuminance +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pulse_convert +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pupil_correct_eyelink +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pupil_correct +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pupil_pp +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_pupil_pp_options +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_quit +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_ren +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_resp_pp +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_rev_con +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_rev_dcm +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_rev_glm +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_rev2 +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_review +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Gabriel Graeni +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_segment_mean +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_sf_auc +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_sf_dcm +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_sf_mp +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_sf_scl +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_sf_theta +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_sf +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_sf_get_theta +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_show_arms +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_spike_convert +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_split_sessions +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Linus RΓΌttimann +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_transfer_function +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_trim +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Dominik Bach +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_version +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_write_channel +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Tobias Moser +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +set_blinks_saccades_to_nan +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Eshref Yozdemir +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/test/pspm_prepdata_test.m b/test/pspm_prepdata_test.m index f9d26de79..f85e04752 100644 --- a/test/pspm_prepdata_test.m +++ b/test/pspm_prepdata_test.m @@ -3,7 +3,7 @@ % unittest class for the pspm_prepdata function %__________________________________________________________________________ % SCRalyze TestEnvironment -% (C) 2013 Linus Rόttimann (University of Zurich) +% (C) 2013 Linus RοΏ½ttimann (University of Zurich) properties end @@ -41,6 +41,7 @@ function invalid_input(this) data = rand(100, 1); + this.verifyWarning(@()pspm_prepdata([1 NaN 3]), 'ID:invalid_input'); %NaN values in data this.verifyWarning(@()pspm_prepdata([1 2 3]), 'ID:invalid_input'); this.verifyWarning(@()pspm_prepdata(data, filt), 'ID:invalid_input'); %missing hporder field filt.hporder = 1; From 8e05813722609c47533a497dd844a511e56f2a4d Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 7 Oct 2019 10:21:33 +0200 Subject: [PATCH 11/55] prep_data do not ignore NaN --- src/pspm_prepdata.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pspm_prepdata.m b/src/pspm_prepdata.m index 7fea0c36c..a5fc51c5a 100644 --- a/src/pspm_prepdata.m +++ b/src/pspm_prepdata.m @@ -41,8 +41,7 @@ % check input for NaN values % ------------------------------------------------------------------------- if any(isnan(data)) - data = data(~isnan(data)); - warning('ID:invalid_input', 'Data contains NaN values. Function will ignore NaN.'); + warning('ID:invalid_input', 'Data contains NaN values.'); end % check input From 58a03195bb15a29c073f8273ae158e300d3046fb Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 7 Oct 2019 10:53:57 +0200 Subject: [PATCH 12/55] Changes after review --- src/pspm_prepdata.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pspm_prepdata.m b/src/pspm_prepdata.m index a5fc51c5a..d77aa0658 100644 --- a/src/pspm_prepdata.m +++ b/src/pspm_prepdata.m @@ -41,7 +41,7 @@ % check input for NaN values % ------------------------------------------------------------------------- if any(isnan(data)) - warning('ID:invalid_input', 'Data contains NaN values.'); + warning('ID:invalid_input', 'Data contains NaN values.'); return; end % check input From b47e476e15e0c5b4c5b69a1e8d0e8ee3e71f0552 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 7 Oct 2019 11:01:08 +0200 Subject: [PATCH 13/55] Delete *.lyx~ files --- doc/PsPM_Developers_Guide.lyx~ | 25924 ------------------------------- 1 file changed, 25924 deletions(-) delete mode 100644 doc/PsPM_Developers_Guide.lyx~ diff --git a/doc/PsPM_Developers_Guide.lyx~ b/doc/PsPM_Developers_Guide.lyx~ deleted file mode 100644 index 0506bf625..000000000 --- a/doc/PsPM_Developers_Guide.lyx~ +++ /dev/null @@ -1,25924 +0,0 @@ -#LyX 2.3 created this file. For more info see http://www.lyx.org/ -\lyxformat 544 -\begin_document -\begin_header -\save_transient_properties true -\origin unavailable -\textclass article -\begin_preamble -\definecolor{colKeys}{rgb}{0,0,1} -\definecolor{colIdentifier}{rgb}{0,0,0} -\definecolor{colComments}{rgb}{0.53, 0.66, 0.42} -\definecolor{colString}{rgb}{0.87, 0.36, 0.51} -\definecolor{barColor}{rgb}{0.43, 0.5, 0.5} -% Added by lyx2lyx -\renewcommand{\textendash}{--} -\renewcommand{\textemdash}{---} -\end_preamble -\use_default_options true -\maintain_unincluded_children false -\language english -\language_package default -\inputencoding auto -\fontencoding global -\font_roman "default" "default" -\font_sans "default" "default" -\font_typewriter "default" "default" -\font_math "auto" "auto" -\font_default_family default -\use_non_tex_fonts false -\font_sc false -\font_osf false -\font_sf_scale 100 100 -\font_tt_scale 100 100 -\use_microtype false -\use_dash_ligatures true -\graphics default -\default_output_format default -\output_sync 0 -\bibtex_command default -\index_command default -\paperfontsize default -\spacing single -\use_hyperref false -\papersize default -\use_geometry false -\use_package amsmath 1 -\use_package amssymb 1 -\use_package cancel 1 -\use_package esint 1 -\use_package mathdots 1 -\use_package mathtools 1 -\use_package mhchem 1 -\use_package stackrel 1 -\use_package stmaryrd 1 -\use_package undertilde 1 -\cite_engine basic -\cite_engine_type default -\biblio_style plain -\use_bibtopic false -\use_indices false -\paperorientation portrait -\suppress_date false -\justification true -\use_refstyle 1 -\use_minted 0 -\index Index -\shortcut idx -\color #008000 -\end_index -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\paragraph_indentation default -\is_math_indent 0 -\math_numbering_side default -\quotes_style english -\dynamic_quotes 0 -\papercolumns 1 -\papersides 1 -\paperpagestyle default -\listings_params "language=Matlab,float=hbp,basicstyle={\footnotesize\ttfamily},identifierstyle={\color{colIdentifier}},keywordstyle={\color{colKeys}},stringstyle={\color{colString}},commentstyle={\itshape\color{colComments}},columns=fixed,tabsize=2,extendedchars=true,showspaces=false,showstringspaces=false,captionpos=t,backgroundcolor={\color{white}},framexleftmargin=1pt,frame=l" -\tracking_changes false -\output_changes false -\html_math_output 0 -\html_css_as_file 0 -\html_be_strict false -\end_header - -\begin_body - -\begin_layout Title -PsPM: Psychophysiological Modelling -\end_layout - -\begin_layout Title -Developer's Guide -\end_layout - -\begin_layout Standard -\align center -Version 4.2.0 -\end_layout - -\begin_layout Standard -\begin_inset VSpace defskip -\end_inset - - -\end_layout - -\begin_layout Standard -\align center - -\size larger -by the PsPM team -\size default - -\begin_inset Foot -status open - -\begin_layout Plain Layout -\noindent -If you have comments on or error corrections to this documentation, please - send them to the PsPM team or post them on: -\begin_inset CommandInset href -LatexCommand href -name "pspm.sourceforge.net" -target "http://pspm.sourceforge.net" -literal "false" - -\end_inset - - -\end_layout - -\end_inset - - -\size larger -: -\end_layout - -\begin_layout Standard -\align center - -\size larger -Dominik R Bach, Giuseppe Castegnetti, Laure Ciernik, Samuel Gerster, Saurabh - Khemka, Christoph Korn, Tobias Moser, Philipp C Paulus, Matthias Staib, - Eshref Yozdemir and collaborators -\size default - -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset CommandInset toc -LatexCommand tableofcontents - -\end_inset - - -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Section -General -\end_layout - -\begin_layout Subsection -Data files: General structure -\end_layout - -\begin_layout Standard -In PsPM the data is saved in mat-files. - Each file contains two variables: -\end_layout - -\begin_layout Itemize - -\family typewriter -infos -\family default - A struct variable with general infos -\end_layout - -\begin_layout Itemize - -\family typewriter -data -\family default - A cell array with a cell for each channel. - -\end_layout - -\begin_layout Standard -The cells contain a struct with channel specific infos and data. - The structs have the mandatory fields: -\end_layout - -\begin_layout Itemize - -\family typewriter -infos.duration -\family default - (in seconds) -\end_layout - -\begin_layout Itemize - -\family typewriter -data{n}.header -\family default - -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Itemize - -\family typewriter -data{n}.header.chantype -\family default - (as defined in the settings) -\end_layout - -\begin_layout Itemize - -\family typewriter -data{n}.header.sr -\family default - (sample rate in 1/second, or timestamp units in seconds) -\end_layout - -\begin_layout Itemize - -\family typewriter -data{n}.header.units -\family default - (data units, or β€˜events’) -\end_layout - -\begin_layout Itemize - -\family typewriter -data{n}.data -\family default - (actual data) -\end_layout - -\end_deeper -\begin_layout Standard -Additionally, a typical file contains the optional infos: -\end_layout - -\begin_layout Itemize - -\family typewriter -infos.sourcefile -\end_layout - -\begin_layout Itemize - -\family typewriter -infos.importfile -\end_layout - -\begin_layout Itemize - -\family typewriter -infos.importdate -\end_layout - -\begin_layout Itemize - -\family typewriter -infos.sourcetype -\end_layout - -\begin_layout Itemize - -\family typewriter -infos.recdate -\end_layout - -\begin_layout Itemize - -\family typewriter -infos.rectime -\end_layout - -\begin_layout Standard -Some data manipulation functions (in particular, pspm_trim) update infos - to record some file history. - -\end_layout - -\begin_layout Subsection -How to add a new import data type -\end_layout - -\begin_layout Subsubsection -Add function -\end_layout - -\begin_layout Standard -\paragraph_spacing single -\noindent -\align block -Function name: pspm_get_xxx (where xxx is the data type name). - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Format: -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -\paragraph_spacing single -\noindent -\align block - -\family typewriter -[sts, import, sourceinfo] = pspm_get_xxx(datafile, import) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\family default -The function needs to take an import job and add, for each job, fields -\end_layout - -\begin_layout Itemize -\noindent -\align block -.data - the actual data for this channel (column vector) -\end_layout - -\begin_layout Itemize -\noindent -\align block -.sr - the sample rate for this channel (only if .autosr enabled in pspm_init) - -\end_layout - -\begin_layout Standard -\noindent -\align block -optional fields -\end_layout - -\begin_layout Itemize -\noindent -\align block -.marker - for marker channels (timestamps or continuous, see pspm_get_marker) - -\end_layout - -\begin_layout Itemize -\noindent -\align block -.markerinfo – optional, see pspm_get_marker -\end_layout - -\begin_layout Itemize -\noindent -\align block -.minfreq - minimum frequency for pulse channels -\end_layout - -\begin_layout Itemize -\noindent -\align block -.units - if data units are defined by the recording software -\end_layout - -\begin_layout Itemize -\noindent -\align block -sts: -1 if import is unsuccessful -\end_layout - -\begin_layout Standard -\noindent -\align block -sourceinfo: contains information on the source file, with field -\end_layout - -\begin_layout Itemize -\noindent -\align block -.chan - a cell of string descriptions of the imported source channels, e. - g. - names, or numbers any optional fields that will be added to infos.source - (e. - g. - recording date & time, and others) -\family typewriter - -\end_layout - -\begin_layout Standard -Notes for multiple blocks: file formats that support multiple block storage - within one file can return cell arrays import{1:blkno} and sourceinfo{1:blkno}; - PsPM will save individual files for each block, with a filename 'pspm_fn_blk0x.m -at'. -\end_layout - -\begin_layout Subsubsection -Add information to settings -\end_layout - -\begin_layout Standard -The file pspm_init contains a block that defines possible import data types. - Add a new field here -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Standard -\noindent - -\family typewriter -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout -\noindent - -% Description of data type -\end_layout - -\begin_layout Plain Layout -\noindent - -% --------------------------------------------- -\end_layout - -\begin_layout Plain Layout -\noindent - -defaults.import.datatypes(1) = ... - -\end_layout - -\begin_layout Plain Layout -\noindent - -struct('short', 'xxx', ... - % short name for internal purposes -\end_layout - -\begin_layout Plain Layout - -'long', 'Datatype description', ... - % long name for GUI -\end_layout - -\begin_layout Plain Layout - -'ext', '*', ... - % data file extension -\end_layout - -\begin_layout Plain Layout - -'funct', @pspm_get_xxx, ... - % import function -\end_layout - -\begin_layout Plain Layout - -'chantypes', {{defaults.chantypes.type}}, ... - % allowed channel types -\end_layout - -\begin_layout Plain Layout - -'chandescription', 'channel', ... - % description of channels for GUI -\end_layout - -\begin_layout Plain Layout - -'multioption', 1, ... - % import of multiple channels for GUI -\end_layout - -\begin_layout Plain Layout - -'searchoption', 1, ... - % allow channel name search for GUI -\end_layout - -\begin_layout Plain Layout - -'automarker', 0, ... - % marker not stored in separate channel -\end_layout - -\begin_layout Plain Layout - -'autosr', 1); % sample rate automatically assigned -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Good to know: -\end_layout - -\begin_layout Itemize -the β€œlong” definition is used in the GUI – make sure it’s readable -\end_layout - -\begin_layout Itemize -if no event channels can be imported, change .chantypes -\end_layout - -\begin_layout Itemize -if channels have searchable names in the import file, set .searchoption = - 1 -\end_layout - -\begin_layout Itemize -if no channel number needs to be assigned for the marker channel, set .automarker - = 1 -\end_layout - -\begin_layout Itemize -if sample rate is contained in import file and determined during import, - set .autosr = 1 -\end_layout - -\begin_layout Itemize -if you need external functions – put them into a folder in the β€˜import’ - subdirectory and add/remove this path within the pspm_get_xxx function -\end_layout - -\begin_layout Subsection -How to add a new channel type -\end_layout - -\begin_layout Subsubsection -Add function -\end_layout - -\begin_layout Standard -Function name: pspm_get_xxx (where xxx is the channel type) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Format: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\family typewriter -[sts, data] = pspm_get_channeltype(import) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\family default -data: data cell of structure readable by pspm_load_data -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Good to know: for event channels, use the function pspm_get_events to convert - various event formats into time stamps (see pspm_get_marker or pspm_get_hb - as an example) -\end_layout - -\begin_layout Subsubsection -Add information to settings -\end_layout - -\begin_layout Standard -Add information on the new channel type and import function to -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\family typewriter - -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -defaults.chantypes(k).type = 'xxx';% channel type name -\end_layout - -\begin_layout Plain Layout - -defaults.chantypes(k).import = @pspm_get_xxx; % conversion function -\end_layout - -\begin_layout Plain Layout - -defaults.chantypes(k).data = 'xxx'; % ’wave’ or ’events’ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -How to add a new GLM type -\end_layout - -\begin_layout Subsubsection -Add information to settings (Example SCR) -\end_layout - -\begin_layout Standard - -\family typewriter -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -defaults.glm(1) = ... - -\end_layout - -\begin_layout Plain Layout - -struct('modality', 'scr', ... - % modality name -\end_layout - -\begin_layout Plain Layout - -'cbf', struct('fhandle', @pspm_bf_scrf, 'args', 1), ... - -\end_layout - -\begin_layout Plain Layout - -% default basis function/set -\end_layout - -\begin_layout Plain Layout - -'filter', struct('lpfreq', 5, 'lporder', 1, ... - -\end_layout - -\begin_layout Plain Layout - -'hpfreq', 0.05, 'hporder', 1, 'down', 10, 'direction', 'uni')); -\end_layout - -\begin_layout Plain Layout - -% default filter settings -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Add default basis function -\end_layout - -\begin_layout Standard -Function name: pspm_bf_xxx -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Function arguments: vector of arguments, first element is time resolution, - further arguments as defined in defaults.glm(n).cbf.args -\end_layout - -\begin_layout Subsection -Warning IDs in PsPM -\end_layout - -\begin_layout Subsubsection -General -\end_layout - -\begin_layout Itemize -invalid_input -\end_layout - -\begin_layout Itemize -invalid_channeltype -\end_layout - -\begin_layout Itemize -nonexistent_file -\end_layout - -\begin_layout Itemize -channel_not_contained_in_file -\end_layout - -\begin_layout Itemize -obsolete_function -\end_layout - -\begin_layout Itemize -not_allowed_channeltype -\end_layout - -\begin_layout Itemize -invalid_data_structure -\end_layout - -\begin_layout Itemize -no_matching_channels -\end_layout - -\begin_layout Itemize -unknown_action -\end_layout - -\begin_layout Itemize -missing_data -\end_layout - -\begin_layout Itemize -out_of_range -\end_layout - -\begin_layout Subsubsection -Function specific -\end_layout - -\begin_layout Standard -pspm_load1 -\end_layout - -\begin_layout Itemize -not_saving_data -\end_layout - -\begin_layout Standard -pspm_interpolate -\end_layout - -\begin_layout Itemize -option_disabled -\end_layout - -\begin_layout Standard -pspm_trim -\end_layout - -\begin_layout Itemize -marker_out_of_range -\end_layout - -\begin_layout Standard -pspm_find_channel -\end_layout - -\begin_layout Itemize -multiple_matching_channels -\end_layout - -\begin_layout Standard -pspm_find_sounds -\end_layout - -\begin_layout Itemize -no_marker_chan -\end_layout - -\begin_layout Itemize -no_sound_chan -\end_layout - -\begin_layout Standard -pspm_get_scr -\end_layout - -\begin_layout Itemize -no_conversion_constant -\end_layout - -\begin_layout Standard -pspm_pp -\end_layout - -\begin_layout Itemize -invalid_freq -\end_layout - -\begin_layout Standard -pspm_prepdata -\end_layout - -\begin_layout Itemize -no_low_pass_filtering -\end_layout - -\begin_layout Itemize -downsampling_failed -\end_layout - -\begin_layout Itemize -nonint_sr -\end_layout - -\begin_layout Standard -pspm_get_timing -\end_layout - -\begin_layout Itemize -invalid_vector_size -\end_layout - -\begin_layout Itemize -event_names_dont_match -\end_layout - -\begin_layout Itemize -no_numeric_vector -\end_layout - -\begin_layout Itemize -no_integers -\end_layout - -\begin_layout Standard -pspm_down -\end_layout - -\begin_layout Itemize -rate_below_minimum -\end_layout - -\begin_layout Section -List of data formats -\end_layout - -\begin_layout Subsection -Supported Channel types -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Data format -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -SCR -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ECG -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Heart Rate -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Heart Beat -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Heart Period -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Respiration -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Pupil Size -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Marker -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Custom -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Sound channel -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Pulse oxymeter -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Gaze x/y, l/r -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -CED Spike -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Matlab -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Text -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Biopach AcqKnowledge ( -\begin_inset Formula $\leq$ -\end_inset - - v3.9.0) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Biopac AcqKnowledge (exported) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Labchart (any Version, Windows only) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Labchart exported -\end_layout - -\begin_layout Plain Layout -( -\begin_inset Formula $\leq$ -\end_inset - - v7.1) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Labchart exported -\end_layout - -\begin_layout Plain Layout -( -\begin_inset Formula $\geq$ -\end_inset - - v7.2) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -VarioPort -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Biograph Infiniti (exported) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Mindmedia Biotrace (exported) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Brain Vision -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Windaq (wdq) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Observer XT compatible -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -NeuroScan -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -BioSemi -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Eyelink -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -European Data Format -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Philips Scanphyslog -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -SMI -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -ViewPoint -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsection -Further settings -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Data format -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Datatype -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -File extension -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Manufacturer -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Import multiple channels -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Search channel names -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Automarker -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Ask for sampling rate -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -CED Spike -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -spike -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.smr -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -CED -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Matlab -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -mat -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.mat -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Text -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Biopach AcqKnowledge ( -\begin_inset Formula $\leq$ -\end_inset - - v3.9.0) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -acq -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.acq -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Biopac -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Biopac AcqKnowledge (exported) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -acqmat -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.mat -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Biopac -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Labchart (any Version, Windows only) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -labchart -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.adicht -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ADInstruments -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Labchart exported -\end_layout - -\begin_layout Plain Layout -( -\begin_inset Formula $\leq$ -\end_inset - - v7.1) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -labchartmat_ext -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.mat -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ADInstruments -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Labchart exported -\end_layout - -\begin_layout Plain Layout -( -\begin_inset Formula $\geq$ -\end_inset - - v7.2) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -labchartmat_in -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.mat -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ADInstruments -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -VarioPort -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -vario -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.vpd -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Becker MediTec -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Biograph Infiniti (exported) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -biograph -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Thought Technology -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Mindmedia Biotrace (exported) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -biotrace -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -MindMedia -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Brain Vision -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -brainvision -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.eeg -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -BrainProducts -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Windaq (wdq) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -windaq -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.wdq -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dataq -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Observer XT compatible -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -observer -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.any -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Noldus -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -NeuroScan -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -cnt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.cnt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -BioSemi -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -biosemi -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.bdf -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Eyelink -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.asc -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -European Data Format -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -edf -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.edf -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -European Data Format -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Philips Scanphyslog -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.log -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Philips -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -SMI -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -SensoMotoric Instruments -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -ViewPoint -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -.txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Arrington Research -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -βœ“ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Standard -Note: Automarkers means no channel number has to be specified because markers - are always at the same place. -\end_layout - -\begin_layout Section -GUI -\end_layout - -\begin_layout Standard - -\shape italic -Contributed by Gabriel GrΓ€ni. -\end_layout - -\begin_layout Subsection -Matlabbatch: Getting started -\end_layout - -\begin_layout Enumerate -Add the trunk folder to the matlab path -\end_layout - -\begin_layout Enumerate -Type pspm_init into the command window (after the execution of the command - the folders pspm_cfg and matlabbatch should be added to the matlab path) -\end_layout - -\begin_layout Enumerate -Start matlabbatch by the typing cfg_ui into the command window -\end_layout - -\begin_layout Enumerate -If the item PsPM exists in the menu bar of matlabbatch you can skip steps - 5 to 7 and continue at step 8 -\end_layout - -\begin_layout Enumerate -Select –> File –> Add Application -\end_layout - -\begin_layout Enumerate -Navigate to the folder pspm_cfg on the left hand side of the window and - select the file pspm_cfg.m on the right hand side –> Press the button Done -\end_layout - -\begin_layout Enumerate -A new item, called PsPM, will appear in the upper menu bar. -\end_layout - -\begin_layout Enumerate -By selecting PsPM the desired action can be selected (at the moment, there - is only Data Preparation –> {Import, Trim} available) -\end_layout - -\begin_layout Subsubsection -Example Function: Trim -\end_layout - -\begin_layout Standard -This example demonstrates how matlabbatch can be used to execute a function. - For all other functions matlabbatch behaves in the same manner. -\end_layout - -\begin_layout Itemize -Select a file by pressing the Select Files Button (under Datafile) -\end_layout - -\begin_layout Itemize -Select Reference and choose an item in the lower part of the window -\end_layout - -\begin_layout Itemize -Fill in the desired values in the fields which are marked with "<-X" -\end_layout - -\begin_layout Itemize -After you have chosen a file and filled in all values correctly, you will - see a green arrow on the upper left part of the window -\end_layout - -\begin_layout Itemize -By pressing on the green arrow the selected file will be trimmed according - to the filled in values -\end_layout - -\begin_layout Subsection -Matlabbatch: How to -\end_layout - -\begin_layout Subsubsection -Preliminaries -\end_layout - -\begin_layout Itemize -Add folder of matlabbatch to the matlab path -\end_layout - -\begin_layout Itemize -Add first application and then load the batch in order to execute a function - -\end_layout - -\begin_layout Subsubsection -Some notes for creating a new application -\end_layout - -\begin_layout Itemize -Leafs (items) are specified first -\end_layout - -\begin_layout Itemize -Assigning child items to .val or .values fields of their parent items -\end_layout - -\begin_layout Itemize -Root node of a tree is specified last -\end_layout - -\begin_layout Itemize -Some examples of items: -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Itemize -cfg_item: -\begin_inset Newline newline -\end_inset - - -\family typewriter - -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -item1= cfg_item; % Defines generic configuration item -\end_layout - -\begin_layout Plain Layout - -item1.name= 'Def 1'; % The display name -\end_layout - -\begin_layout Plain Layout - -item1.tag = 'def1'; % The name appearing in the harvested job -\end_layout - -\begin_layout Plain Layout - -% structure. - This name must be unique -\end_layout - -\begin_layout Plain Layout - -% among all items in the val field of the -\end_layout - -\begin_layout Plain Layout - -% superior node -\end_layout - -\begin_layout Plain Layout - -item1.val = {true}; % Value of item (optional) -\end_layout - -\begin_layout Plain Layout - -item1.help = {'Help...'}; % Help text -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Itemize -cfg_entry: -\begin_inset Newline newline -\end_inset - - -\family typewriter - -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -entry1 = cfg_entry; % Defines entry configuration item -\end_layout - -\begin_layout Plain Layout - -entry1.name = 'Input'; -\end_layout - -\begin_layout Plain Layout - -entry1.tag = 'input'; -\end_layout - -\begin_layout Plain Layout - -entry1.strtye = 'r'; % Type of values which can be entered -\end_layout - -\begin_layout Plain Layout - -entry1.num = [1 1]; % Expected dimension of the input -\end_layout - -\begin_layout Plain Layout - -entry1.help = {'Help...'}; -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Itemize -cfg_choice: -\begin_inset Newline newline -\end_inset - - -\family typewriter - -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -choice = cfg_item; % Defines choice configuration item -\end_layout - -\begin_layout Plain Layout - -choice.name = 'Choice'; -\end_layout - -\begin_layout Plain Layout - -choice.tag = 'choice'; -\end_layout - -\begin_layout Plain Layout - -choice.values = {item1, entry1}; % Defines which items will be -\end_layout - -\begin_layout Plain Layout - -% selectable in the choice menu. - -\end_layout - -\begin_layout Plain Layout - -choice.help = {'Help...'}; -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Itemize -cfg_exbranch: -\begin_inset Newline newline -\end_inset - - -\family typewriter - -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -fct = cfg_exbranch; % Defines the branch that has information -\end_layout - -\begin_layout Plain Layout - -% about how to run this module fct.name = 'Trim'; -\end_layout - -\begin_layout Plain Layout - -fct.tag = 'trim'; -\end_layout - -\begin_layout Plain Layout - -fct.val = {choice}; % The items that belong to this branch. - -\end_layout - -\begin_layout Plain Layout - -% All items must be filled before this -\end_layout - -\begin_layout Plain Layout - -% branch can run or produce virtual -\end_layout - -\begin_layout Plain Layout - -% outputs -\end_layout - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -fct.prog = @cfg_run_fct; % A function handle that will be called -\end_layout - -\begin_layout Plain Layout - -% with the harvested job to run the -\end_layout - -\begin_layout Plain Layout - -% computation -\end_layout - -\begin_layout Plain Layout - -trim.vout = @cfg_vout_fct; % A function handle that will be -\end_layout - -\begin_layout Plain Layout - -% called with the harvested job to -\end_layout - -\begin_layout Plain Layout - -% determine virtual outputs -\end_layout - -\begin_layout Plain Layout - -trim.help = {Help...'}; -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Itemize -There exists a number of other item classes. - Here is a list of the most important classes: cfg_item, cfg_entry, cfg_choice, - cfg_menu, cfg_exbranch, cfg_files, cfg_branch, cfg_repeat -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -For more information call the help function in matlab (e.g. - help help cfg_item) -\end_layout - -\end_deeper -\begin_layout Itemize -Note: -\begin_inset Newline newline -\end_inset - -The inputs to each module have to be described in a tree-like structure. -\begin_inset Newline newline -\end_inset - -During data entry, there is no way to change the tree structure based on - input data. - Add application to the configuration tree by default -\end_layout - -\begin_layout Subsubsection -Add application to the configuration tree by default -\end_layout - -\begin_layout Standard -In the following it is shown how an application can be added to the menu - bar of matlabbatch by default (without adding it every time matlabbatch - is started) -\end_layout - -\begin_layout Itemize -Start matlabbatch and add the appliaction cfg_confgui in the folder matlabbatch/ -cfg_confgui -\end_layout - -\begin_layout Itemize -Put Generate code into the Module list by selecting ConfGUI –> Generate - code in the menu bar -\end_layout - -\begin_layout Itemize -Fill out all the input fields on the right side: -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Itemize -Output filename: This file will contain the whole menu structure, validity - constraints and links to run time code of the appliaction. -\end_layout - -\begin_layout Itemize -Output directory: All files which are created by the ConfGUI will be stored - into this directory (chose a directory which is added to the matlab path) -\end_layout - -\begin_layout Itemize -Root node of config: Name of the root node of the appliaction's configuration - tree -\end_layout - -\begin_layout Itemize -Options: -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Create Defaults File: Yes -\end_layout - -\begin_layout Enumerate -Create mlbatch_appcfg File: Yes -\end_layout - -\begin_layout Enumerate -Create Code for addpath(): No -\end_layout - -\end_deeper -\end_deeper -\begin_layout Itemize -Finally press the green arrow on the upper left side of the batch editor -\end_layout - -\begin_layout Itemize -As no error occurred 3 new files ({Output filename}.m, {Output filename}_def.m, - cfg_mlbatch_appcfg.m) should be created and added into the folder {Output - directory}. -\end_layout - -\begin_layout Itemize -Each time matlabbatch is started, it will search for any cfg_mlbatch_appcfg.m - file (this file contains the names of the configuration files) and will - add the corresponding application to the batch editor. - -\end_layout - -\begin_layout Subsubsection -Add modules to module list -\end_layout - -\begin_layout Standard -Example: Module Import and Trim will be added to the module list -\family typewriter - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -arg1 = 'scr.prep.import_data'; -\end_layout - -\begin_layout Plain Layout - -arg2 = 'scr.prep.trim'; -\end_layout - -\begin_layout Plain Layout - -mod_cfg_id1 = cfg_util('tag2mod_cfg_id',arg1); -\end_layout - -\begin_layout Plain Layout - -mod_cfg_id2 = cfg_util('tag2mod_cfg_id',arg2); -\end_layout - -\begin_layout Plain Layout - -cjob = cfg_util('initjob'); -\end_layout - -\begin_layout Plain Layout - -mod_job_id1 = cfg_util('addtojob', cjob, mod_cfg_id1); -\end_layout - -\begin_layout Plain Layout - -mod_job_id2 = cfg_util('addtojob', cjob, mod_cfg_id2); -\end_layout - -\begin_layout Plain Layout - -cfg_util('harvest', cjob, mod_job_id1); -\end_layout - -\begin_layout Plain Layout - -cfg_util('harvest', cjob, mod_job_id2); -\end_layout - -\begin_layout Plain Layout - -cfg_ui('local_showjob', cfg_ui, cjob); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Changes -\end_layout - -\begin_layout Itemize -In the function private/cfg_onscreen at line 36 figure(fg); is commented - out in order to prevent the appearance of the GUI for a short time if the - function cfg_ui('Visible', 'off') is called. -\end_layout - -\begin_layout Subsection -Matlabbatch: changing help texts and fieldnames -\end_layout - -\begin_layout Subsubsection -File structure of matlabbatch GUI -\end_layout - -\begin_layout Standard -There exist two files per function: 1 configuration file and 1 run file. - The configuration file defines the structure of the corresponding function - in the matlabbatch GUI whereas the run file firstly gathers all entered - values and secondly calls the corresponding SCR function. - Both types of files are located in the subfolder pspm_cfg. - The name of a configuration or a run file consists of two parts. - The prefix of a configuration filename is called pspm_cfg_ whereas the - filename of a run file begins with pspm_cfg_run. - The second part of the filename is named after the function name (eg. - for the function pspm_import.m -> pspm_cfg_import.m, pspm_cfg_run_import.m). -\end_layout - -\begin_layout Subsubsection -Edit help texts and fieldname -\end_layout - -\begin_layout Standard -In order to change any help text or fieldname in a matlabbatch GUI function - the corresponding configuration file has to be opened. - For each item in a matlabbatch GUI function a struct variable which contains - several struct fields is defined in the configuration file. - -\end_layout - -\begin_layout Itemize -Help text The field .help defines the help text of the item which can be - edited in order to change the help text. - As soon as matlabbatch has been closed and opened again, the changes in - the help text will be visible in matlabbatch GUI. -\end_layout - -\begin_layout Itemize -Fieldname The fieldname of an matlabbatch GUI item is defined by the struct - field .tag . - In case a fieldname of an item should be changed be careful to verify if - no other item, which has the same root node, hold the same fieldname. - Otherwise matlabbatch will not work properly. - After the fieldname of an item has been changed the run file (pspm_cfg_run_func -tionname.m) of the corresponding function has to be adapted as well in order - to ensure that the function call in the run file is done properly. - -\end_layout - -\begin_layout Section -Test Environment -\end_layout - -\begin_layout Standard - -\shape italic -Contributed by Linus RΓΌttimann & Tobias Moser. -\end_layout - -\begin_layout Subsection -Unittest: General implementation -\end_layout - -\begin_layout Standard -In PsPM the Matlab Unit Testing Framework is used for testing of functions. - For each tested function there is a Matlab class with the name β€˜functionname_te -st’, which contains the unittests for that specific function. - Additionally there is a documentation page for each of the test classes, - where information about the unittests can be found. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -To run the unittests of a test class, an object of the class has to be created: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -testCase = functionname_test -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -where β€˜testCase’ is an arbitrary object name and β€˜funtionname_test’ is the - name of a test class. - Then all the unittest that are contained in the test class can be run with: - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -testCase.run -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -A specific unittest can be run with: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -testCase.run(β€˜unittest_name’) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Remember that a new test class object must be generated each time the test - class has been changed. -\end_layout - -\begin_layout Subsection -Parameterized test classes -\end_layout - -\begin_layout Standard -Parmeterized test classes is a feature provided by the Matlab test case - class. - A test class is parameterized when it has -\end_layout - -\begin_layout Itemize -Test parameters defined (within the property section) -\end_layout - -\begin_layout Itemize -Test methods implementing the defined test parameters -\end_layout - -\begin_layout Standard -Each function implementing test parameters will be called multiple times - with each possible parameter combination (which is determined by Matlab). - Thus parameterized classes allow to write single tests for different parameter - combinations. - If one of the following test cases is a parameterized test class, it will - be mentioned accordingly. -\end_layout - -\begin_layout Subsection -Testcases: pspm_align_channels_test -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_align_channels_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data, duration] = pspm_align_channels(data, induration) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -This test uses data stored in -\family typewriter -ImportTestData/ecg2hb/tpspm_s102_s1.mat -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings given invalid inputs. -\end_layout - -\begin_layout Subsubsection* -Lower optional duration -\end_layout - -\begin_layout Standard -Function name: lower_optional_duration(this) -\begin_inset Newline newline -\end_inset - -Description: Passes an optional duration that is less than the maximum duration - of all channels in the input to pspm_align_channels. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Assert that lower optional duration has no effect on the output. -\end_layout - -\begin_layout Enumerate -Check if all of the returned channels have the same duration. -\end_layout - -\begin_layout Subsubsection* -Same optional duration -\end_layout - -\begin_layout Standard -Function name: same_optional_duration(this) -\begin_inset Newline newline -\end_inset - -Description: Passes an optional duration that is equal to the maximum duration - of all channels in the input to pspm_align_channels and does the exact - same checks as in lower duration case. -\end_layout - -\begin_layout Subsubsection* -Higher optional duration -\end_layout - -\begin_layout Standard -Function name: higher_optional_duration(this) -\begin_inset Newline newline -\end_inset - -Description: Passes an optional duration that is higher than the maximum - duration of all channels. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Assert that durations of all returned channels is the same as the passed - optional duration. -\end_layout - -\begin_layout Subsubsection* -Max duration is passed in marker channel -\end_layout - -\begin_layout Standard -Function name: max_duration_is_given_in_events(this) -\begin_inset Newline newline -\end_inset - -Description: Passes the maximum duration in marker channel to pspm_align_channel -s. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Assert that all returned channels are aligned to the maximum duration passed - in marker channel. -\end_layout - -\begin_layout Subsubsection* -Various case checks -\end_layout - -\begin_layout Standard -Function names: -\end_layout - -\begin_layout Enumerate -only_one_channel_longer_others_same(this) -\end_layout - -\begin_layout Enumerate -only_one_channel_shorter_others_same(this) -\end_layout - -\begin_layout Enumerate -increasing_channel_lengths(this) -\end_layout - -\begin_layout Enumerate -two_same_others_shorter(this) -\end_layout - -\begin_layout Standard -Description: In each of these cases check if the returned channels have - the same duration that is equal to the maximum duration of all input channels. -\end_layout - -\begin_layout Subsection -Testcases: pspm_bf_test -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_bf_test -\begin_inset Newline newline -\end_inset - -Function: [bs, x] = pspm_bf_ -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -This test class is parameterized. -\end_layout - -\begin_layout Subsubsection* - -\series bold -Method setup parameters -\end_layout - -\begin_layout Standard -These parameters define which function should be tested -\series bold -. -\begin_inset Newline newline -\end_inset - - -\series default - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Basis function -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Specifies the basis functions to test (without the 'pspm_bf_' prefix). - The current basis function to test is then called via this.bf(); -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Test parameters -\end_layout - -\begin_layout Standard -These are parameters which define what kind of data or option should be - passed to each basis function. -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Time res log -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Specifies for the basic test different time resolutions (argument 'td') - which a basis function should be able to handle (as long as td <= duration). - The values are logarithmic and have to be translated before passed to the - basis function. -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -this.bf() [no parameters] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -this.bf(dur+1) [pass 'td' > duration of function] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -this.bf(0) [invalid time resolution] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Basic -\end_layout - -\begin_layout Standard -Function name: test_basic(this, time_res_log) -\begin_inset Newline newline -\end_inset - -Description: Test for different requirements to verify whether the current - basis function is valid or not. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test with td = 0.1, verify that no warning is issued and determine the duration -\end_layout - -\begin_layout Enumerate -Test with td = 0.01 and check if the new duration is equal to the duration - calculated before. -\end_layout - -\begin_layout Enumerate -Test if function runs through without warning and that the time vector begins - at <= 0. -\end_layout - -\begin_layout Enumerate -Test if the function runs through without warning with td = 10^time_res_log - (as long as td < duration) -\end_layout - -\begin_layout Subsection -Testcases: pspm_convert_unit -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_convert_unit_test -\begin_inset Newline newline -\end_inset - -Function: [sts, converted] = pspm_convert_unit(data, from, to) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Subsubsection* -Constants -\end_layout - -\begin_layout Itemize -inch_to_cm = 2.54 -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(testCase) -\begin_inset Newline newline -\end_inset - -Description: Pass invalid from or to metrics and check if warnings are issued. -\end_layout - -\begin_layout Subsubsection* -Valid input -\end_layout - -\begin_layout Standard -Function name: valid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Pass various valid inputs and compare results to manually calculate -d ones. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -If empty input data is passed, result is also empty. -\end_layout - -\begin_layout Enumerate -Convert single cm value to m. -\end_layout - -\begin_layout Enumerate -Various unit conversion checks: -\end_layout - -\begin_deeper -\begin_layout Enumerate -Conversion between same units (cm to cm) -\end_layout - -\begin_layout Enumerate -mm to km and km to mm conversions -\end_layout - -\begin_layout Enumerate -inch to cm conversions -\end_layout - -\end_deeper -\begin_layout Enumerate -Negative value conversions -\end_layout - -\begin_layout Enumerate -Convert single dimensional array with multiple elements. -\end_layout - -\begin_layout Enumerate -Convert each element in 3D array. -\end_layout - -\begin_layout Subsection -Testcases: pspm_ecg2hb -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_ecg2hb_test -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Function: [sts,pt_debug] = pspm_ecg2hb(fn, chan, options) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Subsubsection* -Constants -\end_layout - -\begin_layout Itemize -testdata{0}.chan_struct = struct('nr', 1, 'name', 'ecg'); -\end_layout - -\begin_layout Itemize -testdata{0}.filename = 'ImportTestData -\backslash -ecg2hb -\backslash -test_ecg77.mat'; -\end_layout - -\begin_layout Itemize -testdata{0}.num_channels = 1 -\end_layout - -\begin_layout Itemize -testdata{1}.chan_struct = struct('nr', 3, 'name', 'ecg'); -\end_layout - -\begin_layout Itemize -testdata{1}.filename = 'ImportTestData -\backslash -ecg2hb -\backslash -tpspm_s102_s1.mat'; -\end_layout - -\begin_layout Itemize -testdata{1}.num_channels = 5 -\end_layout - -\begin_layout Itemize -backup_suffix = '_backup'; -\end_layout - -\begin_layout Itemize -options = struct('semi', 0); -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input arguments -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Pass invalid input arguments and check if the warnings are - as expected. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ecg2hb() [no arguments] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ecg2hb(1) [invalid file name] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ecg2hb(this.fn, 'bla') [invalid channel (text)] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ecg2hb(this.fn, 1) [invalid channel type] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:not_allowed_channeltype -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -o.twthresh = 'bla'; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid twthresh - (text)] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -o.minHR = 202; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid minHR (> default_maxHR -)] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -o.minHR = 202; o.maxHR = 19; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid minHR - > maxHR] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -o.maxHR = 19; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid maxHR (< default_minHR) -] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -o.debugmode = 5; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid debugmode (not - in [0,1])] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -o.semi = 5; pspm_ecg2hb(this.fn, this.chan.nr, o) [invalid semi (not in [0,1])] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Valid input arguments -\end_layout - -\begin_layout Standard -Function name: valid_input(this) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Pass valid input arguments and check if there are no warnings. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ecg2hb(this.fn, this.chan.nr, this.options) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ecg2hb(this.fn, this.chan.name, this.options) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -this.test_added_data() -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Other Methods -\end_layout - -\begin_layout Subsubsection* -Test for added data -\end_layout - -\begin_layout Standard -Function name: test_added_data() -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Check if added hb channels show an expected behaviour. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests (for each channel): -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Tested Value -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected Value -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Sampling rate -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Unit -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -'events' -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Channel type -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -'hb' -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Amount of data points in data -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -> 1 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Heartbeat indices are monotonically increasing -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -True -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Maximum number of heartbeats per second -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -< 5 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Data is distributed equally (standard deviation) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -< 2s -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Time between end of recording and last data point -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -< 60s -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsection -Testcases: pspm_find_channel -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_find_channel_test -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Function: chan = pspm_find_channel(headercell, chantype) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input arguments -\end_layout - -\begin_layout Standard -Function name: invalid_inputargs(this) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Setup: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\family typewriter -headercell = {'heart', 'scr', 'pupil'}; -\family default - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel('str','scr') [no headercell] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel(headercell, 'str') -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:not_allowed_channeltype -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel(headercell, 4) [no string chantype] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Valid Input Arguments -\end_layout - -\begin_layout Standard -Function name: valid_inputargs(this) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: Checks for correct return value if the input arguments are - valid -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Setup: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\family typewriter -headercell = {'heart', 'scr', 'pupil', 'mark', 'gsr', 'eda'}; -\family default - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Exp. - Output -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel(headercell, 'pupil') -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel(headercell, 'resp') -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:no_matching_channels -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel(headercell, 'scr') -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout --1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:multiple_matching_channels -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel(headercell, {'mark', 'str', 'bla'}) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout - -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel(headercell, {'call', 'str', 'me'}) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -no matching channel, but no warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel(headercell, {'scr', 'gsr', 'eda'}) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout --1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -multiple matching channels, but no warning -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsection -Testcases: pspm_extract_segments -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_extract_segments_test -\begin_inset Newline newline -\end_inset - -Function: [sts, out] = pspm_extract_segments(varargin) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -This test class is parameterized. - For manual mode tests, the test data is generated by the function itself - and when needed, files will be written to testdatafile.mat. - For auto mode tests, the test data must be in -\family typewriter -ImportTestData/fitted_models -\family default - folder with names as specified in the tests. -\end_layout - -\begin_layout Subsubsection* -Test parameters -\end_layout - -\begin_layout Standard -These are parameters which define what kind of data should be passed to - -\family typewriter -pspm_extract_segments -\family default - in auto mode tests and which options should be set. -\end_layout - -\begin_layout Itemize -nan_output: This option defines whether the user wants to output the NaN - ratios of the trials for each condition. - If so, we values can be printed on the screen (on MATLAB command window) - or written to a created file. -\end_layout - -\begin_layout Itemize -nan_ratio: Defines ratio of NaN values in the generated test data -\end_layout - -\begin_layout Itemize -nr_trail: Number of trails in the generated test data -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. -\end_layout - -\begin_layout Standard -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_extract_segments() -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_extract_segments('a','b') -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_extract_segments('manual',fn,0) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_inpu -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_extract_segments('manual',[0.1,2],0,timing) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_extract_segments('manual',fn,'a',timing) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_extract_segments('manual',fn,{'a'},timing) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_extract_segments('auto',{1}) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_extract_segments('auto','some') -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Test manual mode with indicated length -\end_layout - -\begin_layout Standard -Function name: test_manual_length(this,nr_trial,nan_ratio) -\begin_inset Newline newline -\end_inset - -Desctiption: Checks for equality of produced segments by pspm_extract_segments - with manually computed segments -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate segments form test data. -\end_layout - -\begin_layout Enumerate -Test if function call wirked WarningFree -\end_layout - -\begin_layout Enumerate -Test if variable 'segments' existis in output -\end_layout - -\begin_layout Enumerate -Test if correct number of segments were produced -\end_layout - -\begin_layout Enumerate -Test each segment holds correct data -\end_layout - -\begin_layout Subsubsection* -Test manual mode with durations -\end_layout - -\begin_layout Standard -Function name: test_manual_duration(this,nr_trial,nan_ratio) -\begin_inset Newline newline -\end_inset - -Desctiption: Checks for equality of produced segments by pspm_extract_segments - with manually computed segments -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate segments form test data. -\end_layout - -\begin_layout Enumerate -Test if function call wirked WarningFree -\end_layout - -\begin_layout Enumerate -Test if variable 'segments' existis in output -\end_layout - -\begin_layout Enumerate -Test if correct number of segments were produced -\end_layout - -\begin_layout Enumerate -Test each segment holds correct data -\end_layout - -\begin_layout Subsubsection* -Test auto mode with GLM using marker onsets -\end_layout - -\begin_layout Standard -Function name: -\family typewriter -test_auto_mode_glm_with_markers(this) -\family default - -\begin_inset Newline newline -\end_inset - -Description: Runs -\family typewriter -pspm_extract_segments -\family default - with a particular GLM model stored in -\family typewriter -ImportTestData/fitted_models -\family default - and compares the results to manually calculated results. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if length of the returned cell array (from now on called -\family typewriter -segments -\family default -) is the same as the number of conditions -\end_layout - -\begin_layout Enumerate -Test if shape of data arrays in each element of -\family typewriter -segments -\family default - agrees with the passed durations and number of onsets. -\end_layout - -\begin_layout Enumerate -Test if -\family typewriter -segments.trial_idx -\family default - agrees with input data. -\end_layout - -\begin_layout Enumerate -Test if statistics calculated manually from -\family typewriter -segments.data -\family default - is the same as -\family typewriter -segments.mean -\family default - and -\family typewriter -segments.std -\family default -. -\end_layout - -\begin_layout Enumerate -Compute each statistic field in each element of -\family typewriter -segments -\family default - manually using the input data and compare the results to -\family typewriter -segments -\family default -. -\end_layout - -\begin_layout Subsubsection* -Test auto mode with GLM using second onsets -\end_layout - -\begin_layout Standard -Function name: -\family typewriter -test_auto_mode_glm_with_seconds(this) -\family default - -\begin_inset Newline newline -\end_inset - -Description: Do the exact same tests as in -\family typewriter -test_auto_mode_glm_with_markers -\family default - but this time using seconds to specify onsets. -\end_layout - -\begin_layout Subsubsection* -Test auto mode with DCM -\end_layout - -\begin_layout Standard -Note: Since in DCM case onsets are calculated using trial start and end - seconds of DCM trials, there is no second/marker distinction in DCM test. -\begin_inset Newline newline -\end_inset - -Function name: -\family typewriter -test_auto_mode_dcm(this) -\family default - -\begin_inset Newline newline -\end_inset - -Description: Runs -\family typewriter -pspm_extract_segments -\family default - with a particular DCM model stored in -\family typewriter -ImportTestData/fitted_models -\family default - and compares the results to manually calculated results. - In order to get meaningful condition statistic information this test function - assigns the same trial name to certain groups of trials. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: Do the exact same tests as in -\family typewriter -test_auto_mode_glm_with_markers -\family default - by adapting the computation steps to DCM case. -\end_layout - -\begin_layout Subsection -Testcases: pspm_find_sounds -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_find_sounds_test -\begin_inset Newline newline -\end_inset - -Function: [sts, infos] = pspm_find_sounds(file, options) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -This test class is parameterized. - The test data is generated by the function itself and when needed, files - will be written to testdatafile.mat. -\end_layout - -\begin_layout Subsubsection* -Test parameters -\end_layout - -\begin_layout Standard -These are parameters which define what kind of data should be passed to - pspm_find_sounds and which options should be set. -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Channel output -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Specifies whether 'all' found markers or only 'corrected' markers should - be returned. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Max delay -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Varies the max delay option and defines how far away a marker at most can - be. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Min delay -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Varies the min delay option and defines how far away a marker at least should - be. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Threshold -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines the minimum size of a marker to be recognized as a marker event. - Passed in percent of the maximum amplitude of the recorded data. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Resample -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines whether the function should resample (and interpolate) the data - to a higher sample rate in order to get more exact marker findings. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Channel action -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines whether a newly created marker channel should replace the existing - marker channel or should be added as a new marker channel. -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds('') -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:file_not_found -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn) [invalid pspm file] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn) [pspm file without a 'snd' channel] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:no_sound_chan -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn, o) [invalid values for positive integer fields] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn, o) [invalid values for positive numeric fields] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn, o) [invalid values for logic fields] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn, o) [invalid channel ids for channel fields] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:out_of_range -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn, o) [enabled diagnostics without a marker channel] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:no_marker_chan -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn, o) [invalid values for channelaction] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn, o) [invalid values for roi] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds(fn, o) [maxdelay < mindelay] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Test add channel -\end_layout - -\begin_layout Standard -Function name: test_add_channel(this, channeloutput, max_delay, resample, - channelaction) -\begin_inset Newline newline -\end_inset - -Description: Test add channel with different options. - Diagnostics is always enabled, Channel output, Max delay, Resample and - Channel action are varied. - Once pspm_find_sounds is complete, the function tests if the returned data - has the expected format. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with channel 'snd' and 'marker'; and count amount of reference - markers -\end_layout - -\begin_layout Enumerate -Set -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -options according to test parameters -\end_layout - -\begin_layout Enumerate -diagnostics to 1 -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if returned data has the correct format -\end_layout - -\begin_layout Enumerate -Test if channels has been added or replaced -\end_layout - -\begin_layout Enumerate -Test if added channel has correct amount of data -\end_layout - -\begin_layout Subsubsection* -Test region count -\end_layout - -\begin_layout Standard -Function name: test_region_count(this) -\begin_inset Newline newline -\end_inset - -Description: Test region of interest in combination with expected sound - count. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with channel 'snd' and 'marker' -\end_layout - -\begin_layout Enumerate -Test if function finds the function finds all markers in the whole file -\end_layout - -\begin_layout Enumerate -Test if function finds all the markers in the whole file with initial threshold - 1 -\end_layout - -\begin_layout Enumerate -Test if function finds half of the markers in half of the file -\end_layout - -\begin_layout Subsubsection* -Test threshold -\end_layout - -\begin_layout Standard -Function name: test_threshold(this, threshold) -\begin_inset Newline newline -\end_inset - -Description: Vary the threshold option and test whether the functions returnes - the expected data. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with channel 'snd' and 'marker' -\end_layout - -\begin_layout Enumerate -Set -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -threshold according to test parameter -\end_layout - -\begin_layout Enumerate -diagnostics to 1 -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if returned data has the correct format -\end_layout - -\begin_layout Subsubsection* -Test plot -\end_layout - -\begin_layout Standard -Function name: test_plot(this, threshold) -\begin_inset Newline newline -\end_inset - -Description: Test if the plot functions returne the expected data and runs - through without warning. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with channel 'snd' and 'marker' -\end_layout - -\begin_layout Enumerate -Set -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -plot to 1 -\end_layout - -\begin_layout Enumerate -diagnostics to 1 -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if returned data has the correct format -\end_layout - -\begin_layout Subsection -Testcases: pspm_find_valid_fixations -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_find_valid_fixations_test -\begin_inset Newline newline -\end_inset - -Function: [sts, out_file] = pspm_find_valid_fixations(fn, options) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -This test class is parameterized. - The test data is generated by the function itself and when needed, files - will be written to testdatafile.mat. -\end_layout - -\begin_layout Paragraph* -Test parameters -\end_layout - -\begin_layout Standard -These are parameters which define what kind of data should be passed to - pspm_find_valid_fixations and which options should be set. -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Distance -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Used for gaze validation; defines the distance between eyes and screen. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Aspect used -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Used for gaze validation; defines the aspect ratio set in the software. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Aspect actual -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Used for gaze validation; defines the aspect ratio of the hardware. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Screen size -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Used for gaze validation; defines the size of the screen in inches. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Eyes -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Is used for data generation and tells the function for which eyes data should - be generated. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Channel action -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines whether to 'add' or 'replace' existing channels. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Newfile -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines whether to create a new file or extend the existing file. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Overwrite -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines whether to overwrite the existing file or not. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Interpolate -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines whether to interpolate NaN values in validated channels or not. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Missing -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines whether to create a channel which holds information about which - positions have been set to NaN (and may have been interpolated afterwards). -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Work eye -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines which eyes should be used for fixation validation. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Work chans -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines which channels should be set to NaN during invalid fixations. -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations() -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations('a') -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.validate_fixations] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.box_degree] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.screen_settings] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [missing fields for options.screen_setting -s] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.aspect_actual] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.aspect_used] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.bitmap] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.display_size] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.display_size] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.fixation_point] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.channel_action] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.newfile] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.overwrite] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.interpolate] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.missing] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid eyes] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations(fn, options) [invalid options.channels] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Test work chans -\end_layout - -\begin_layout Standard -Function name: test_work_chans(this, work_chans) -\begin_inset Newline newline -\end_inset - -Description: Tests whether the option 'channels' actually works on the specified - channels or not. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz -e 20 and eyes 'lr' -\end_layout - -\begin_layout Enumerate -Set options with -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -overwrite = 1 -\end_layout - -\begin_layout Enumerate -channels = work_chans -\end_layout - -\begin_layout Enumerate -channel_action = 'add' -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if sts equals 1 -\end_layout - -\begin_layout Enumerate -Test if specified work_chans are added as new processed channels -\end_layout - -\begin_layout Subsubsection* -Test work eye -\end_layout - -\begin_layout Standard -Function name: test_work_eye(this, work_eye) -\begin_inset Newline newline -\end_inset - -Description: Test whether the option 'eyes' actually works on the specified - eyes or not. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz -e 20 and eyes 'lr' -\end_layout - -\begin_layout Enumerate -Set options with -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -overwrite = 1 -\end_layout - -\begin_layout Enumerate -eyes = work_eye -\end_layout - -\begin_layout Enumerate -channel_action = 'add' -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if sts equals 1 -\end_layout - -\begin_layout Enumerate -Test if specified eyes have been processed accordingly and test if not specified - eyes have ignored. -\end_layout - -\begin_layout Subsubsection* -Test missing -\end_layout - -\begin_layout Standard -Function name: test_missing(this, missing) -\begin_inset Newline newline -\end_inset - -Description: Test whether for each a a new missing channel is created if - missing is specified as true. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz -e 20 and eyes 'lr' -\end_layout - -\begin_layout Enumerate -Set options with -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -overwrite = 1 -\end_layout - -\begin_layout Enumerate -missing = missing -\end_layout - -\begin_layout Enumerate -channel_action = 'add' -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if sts equals 1 -\end_layout - -\begin_layout Enumerate -Depending on the status of 'missing' test if there are any missing channels - or if there is no missing channel -\end_layout - -\begin_layout Subsubsection* -Test interpolate -\end_layout - -\begin_layout Standard -Function name: test_interpolate(this, interpolate) -\begin_inset Newline newline -\end_inset - -Description: Test whether data is interpolated during periods which are - set to NaN by the function. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz -e 20 and eyes 'lr' -\end_layout - -\begin_layout Enumerate -Set options with -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -overwrite = 1 -\end_layout - -\begin_layout Enumerate -interpolate = interpolate -\end_layout - -\begin_layout Enumerate -channel_action = 'add' -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if sts equals 1 -\end_layout - -\begin_layout Enumerate -Depending on the status of 'interpolate' test whether there are some NaN - values or if NaN periods have been interpolated accordingly. -\end_layout - -\begin_layout Subsubsection* -Test overwrite -\end_layout - -\begin_layout Standard -Function name: test_overwrite(this, overwrite) -\begin_inset Newline newline -\end_inset - -Description: Test if files are overwritten, if specified with 'overwrite' - option. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz -e 20 and eyes 'lr' -\end_layout - -\begin_layout Enumerate -Set options with -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -overwrite = 1 -\end_layout - -\begin_layout Enumerate -interpolate = interpolate -\end_layout - -\begin_layout Enumerate -channel_action = 'add' -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if sts equals 1 -\end_layout - -\begin_layout Enumerate -Test if file has been overwritten or not (tests, if there are any new channels). -\end_layout - -\begin_layout Subsubsection* -Test channel action -\end_layout - -\begin_layout Standard -Function name: test_channel_action(this, channel_action) -\begin_inset Newline newline -\end_inset - -Description: Test if channels are added or replaced (according to channel_action -). -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz -e 20 and eyes 'lr' -\end_layout - -\begin_layout Enumerate -Set options with -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -overwrite = 1 -\end_layout - -\begin_layout Enumerate -channel_action = channel_action -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if sts equals 1 -\end_layout - -\begin_layout Enumerate -Test if channels have been added or replaced (tests, if there are any new - channels). -\end_layout - -\begin_layout Subsubsection* -Test newfile -\end_layout - -\begin_layout Standard -Function name: test_newfile(this, newfile) -\begin_inset Newline newline -\end_inset - -Description: Test whether the output is written to a newfile or to the input - file. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with distance 500, aspect_used 16:9, aspect_actual 4:3, screen_siz -e 20 and eyes 'lr' -\end_layout - -\begin_layout Enumerate -Set options with -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -overwrite = 1 -\end_layout - -\begin_layout Enumerate -if newfile enabled -\end_layout - -\begin_deeper -\begin_layout Enumerate -search for new file name -\end_layout - -\begin_layout Enumerate -set options.newfile to new file name -\end_layout - -\end_deeper -\begin_layout Enumerate -if newfile is disabled, set options.newfile to '' -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if function runs through without warning -\end_layout - -\begin_layout Enumerate -Test if sts equals 1 -\end_layout - -\begin_layout Enumerate -Test if returned outputfile equals the specified newfile or not (depending - on the value of 'newfile') -\end_layout - -\begin_layout Subsubsection* -Test gaze validation -\end_layout - -\begin_layout Standard -Function name: test_gaze_validation(this, distance, screen_size, aspect_actual, - aspect_used, eyes) -\begin_inset Newline newline -\end_inset - -Description: Test whether gaze validation is done correctly. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with the according function parameters -\end_layout - -\begin_layout Enumerate -Iterate to returned degree values generated by the generation function -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -set function options -\end_layout - -\begin_deeper -\begin_layout Enumerate -overewrite = 1 -\end_layout - -\begin_layout Enumerate -validate_fixation =1 -\end_layout - -\begin_layout Enumerate -screen_settings and distance to function call settings -\end_layout - -\begin_layout Enumerate -missing = 1 -\end_layout - -\end_deeper -\begin_layout Enumerate -depending on the specified degree, test whether function runs through without - warnings or not -\end_layout - -\begin_layout Enumerate -load outputfile and test if (according to degree expectation) gaze validation - has been done or not -\end_layout - -\end_deeper -\begin_layout Subsubsection* -Test bitmap validtion -\end_layout - -\begin_layout Standard -Function name: test_bitmap_validation(this, distance, resolution, eyes) -\begin_inset Newline newline -\end_inset - -Description: Test whether bitmap validation is done correctly. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with the according function parameters -\end_layout - -\begin_layout Enumerate -Iterate to returned bitmaps generated by the generation function -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -set function options -\end_layout - -\begin_deeper -\begin_layout Enumerate -missing = 1 -\end_layout - -\end_deeper -\begin_layout Enumerate -ddepending on the specified number of valid fixations in the bitmap, test - whether function runs through without warnings or not -\end_layout - -\begin_layout Enumerate -load outputfile and test if (according to bitmap expectation) bitmap validation - has been done or not -\end_layout - -\end_deeper -\begin_layout Subsection -Testcases: pspm_get_ecg -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_ecg_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data] = pspm_get_ecg(import) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Test -\end_layout - -\begin_layout Standard -Function name: test(this) -\begin_inset Newline newline -\end_inset - -Description: Test if all fields are returned correctly -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -Test if data.data is equal import.data -\end_layout - -\begin_layout Enumerate -Test if data.header.chantype is β€˜ecg’ -\end_layout - -\begin_layout Enumerate -Test if data.header.units is equal import.units -\end_layout - -\begin_layout Enumerate -Test if data.header.sr is equal import.sr -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_events -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_events_test -\begin_inset Newline newline -\end_inset - -Function: [sts, import] = pspm_get_events(import) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Check warnings -\end_layout - -\begin_layout Standard -Function name: check_warnings(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the field β€˜.markers’ is missing or contains - invalid content. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Missing marker field -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:nonexistent_field -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -import.marker = β€˜foo’ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_field_content -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Timestamps -\end_layout - -\begin_layout Standard -Function name: timestamps(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for correct output if the input is timestamp data -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -Test if the length of the output data is equal to the length of the input - data -\end_layout - -\begin_layout Subsubsection* -Continuous -\end_layout - -\begin_layout Standard -Function name: continuous(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for correct output if the input is continuous data -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Perform three tests with different settings -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Standard -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -Test if the length of the field 'markerinfo' is equal to the length of the - output data. -\end_layout - -\begin_layout Enumerate -Test if the length of the output data is equal to the expected number of - pulses in the input data. -\end_layout - -\begin_layout Standard -Settings: -\end_layout - -\begin_layout Enumerate -flank = β€˜both’ (default) -\end_layout - -\begin_layout Enumerate -flank = 'both' & data offset 50 -\end_layout - -\begin_layout Enumerate -flank = β€˜ascending’ -\end_layout - -\begin_layout Enumerate -flank = β€˜descending’ -\end_layout - -\begin_layout Enumerate -inverted input signal -\end_layout - -\begin_layout Enumerate -signal with angular flanks -\end_layout - -\begin_layout Enumerate -check with -\end_layout - -\end_deeper -\begin_layout Enumerate -Additional test for setting (b): Test if data offset has been removed in - the output data. -\end_layout - -\begin_layout Enumerate -Additional test for setting (c) and (d): Test if positions returned by output - data correspond to flank changes in the input data. -\end_layout - -\begin_layout Enumerate -Test if markerinfo is not set if it has been set before. -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_eyelink -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_eyelink_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data] = pspm_get_eyelink(import) -\end_layout - -\begin_layout Subsubsection -Methods -\end_layout - -\begin_layout Subsubsection* -set_import_values -\end_layout - -\begin_layout Standard -Function : [import_struct, channel typles] = set_import_values(this) -\begin_inset Newline newline -\end_inset - -Description: Helperfunction, which creates an import data set and the expected - channel data set -\end_layout - -\begin_layout Subsubsection* -verify_basic_data_structure -\end_layout - -\begin_layout Standard -Function name: verify_basic_data_structure(this, data, sourceinfo, channel_types -) -\begin_inset Newline newline -\end_inset - -Description: Tests if the returned data structure is valid and match a given - expected pattern. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if all channels are numeric -\end_layout - -\begin_layout Enumerate -Test if recorded time and date have a valid format -\end_layout - -\begin_layout Enumerate -Test if blink channels have correct unit -\end_layout - -\begin_layout Enumerate -Test if pupil channels have either 'diameter' or 'area' as unit -\end_layout - -\begin_layout Enumerate -Test if channels labeled with 'position' have unit 'pixel' -\end_layout - -\begin_layout Enumerate -Test if channels labeled with 'blink' have unit 'blink' -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -test_multi_session -\end_layout - -\begin_layout Standard -Function name: test_multi_session(this) -\begin_inset Newline newline -\end_inset - -Description: Test if the returned data structure fits into the pattern of - a multi session data set. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Calls 'set_import_values(this)' to get import data set and expected channel - data set -\end_layout - -\begin_layout Enumerate -passses returned sets to 'verify_basic_data_structure()' -\end_layout - -\begin_layout Subsubsection* -test_two_eyes -\end_layout - -\begin_layout Standard -Function name: test_two_eyes(this) -\begin_inset Newline newline -\end_inset - -Description: Test if the returned data structure fits into the pattern of - a two eyes data set. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Calls 'set_import_values(this)' to get import data set and expected channel - data set -\end_layout - -\begin_layout Enumerate -passes returned sets to 'verify_basic_data_structure()' -\end_layout - -\begin_layout Subsubsection* -test_one_eye -\end_layout - -\begin_layout Standard -Function name: test_one_eye(this) -\begin_inset Newline newline -\end_inset - -Description: Test if the returned data structure fits into the pattern of - a one eye data set. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Creates an import data set and the expected channel data set an pass it - to 'verify_basic_data_structure()' -\end_layout - -\begin_layout Subsubsection* -test_track_dist -\end_layout - -\begin_layout Standard -Function name: test_track_dist(this) -\begin_inset Newline newline -\end_inset - -Description: Test if the returned data structure fits into the pattern of - a two eyes data with eyelink_trackdist set. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Calls 'set_import_values(this)' to get import data set and expected channel - data set -\end_layout - -\begin_layout Enumerate -owerwrites some import data and channel data -\end_layout - -\begin_layout Enumerate -pass returned sets to 'verify_basic_data_structure()' -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_hb -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_hb_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data] = pspm_get_hb(import) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Test -\end_layout - -\begin_layout Standard -Function name: test(this) -\begin_inset Newline newline -\end_inset - -Description: Test if all fields are returned correctly -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -Test if data.data is equal import.data -\end_layout - -\begin_layout Enumerate -Test if data.header.chantype is β€˜hb’ -\end_layout - -\begin_layout Enumerate -Test if data.header.units is β€˜events’ -\end_layout - -\begin_layout Enumerate -Test if data.header.sr is 1 -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_hr -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_hr_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data] = pspm_get_hr(import) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Test -\end_layout - -\begin_layout Standard -Function name: test(this) -\begin_inset Newline newline -\end_inset - -Description: Test if all fields are returned correctly -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -Test if data.data is equal import.data -\end_layout - -\begin_layout Enumerate -Test if data.header.chantype is β€˜hr’ -\end_layout - -\begin_layout Enumerate -Test if data.header.units is equal import.units -\end_layout - -\begin_layout Enumerate -Test if data.header.sr is equal import.sr -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_marker -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_marker_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data] = pspm_get_marker(import) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Test -\end_layout - -\begin_layout Standard -Function name: test(this) -\begin_inset Newline newline -\end_inset - -Description: Test if all fields are returned correctly -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -Test if data.data is equal import.data -\end_layout - -\begin_layout Enumerate -Test if data.header.chantype is β€˜marker’ -\end_layout - -\begin_layout Enumerate -Test if data.header.units is β€˜events’ -\end_layout - -\begin_layout Enumerate -Test if data.header.sr is 1 -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_pupil -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_pupil_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data] = pspm_get_pupil(import) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Test -\end_layout - -\begin_layout Standard -Function name: test(this) -\begin_inset Newline newline -\end_inset - -Description: Test if all fields are returned correctly -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -Test if data.data is equal import.data -\end_layout - -\begin_layout Enumerate -Test if data.header.chantype is β€˜pupil’ -\end_layout - -\begin_layout Enumerate -Test if data.header.units is equal import.units -\end_layout - -\begin_layout Enumerate -Test if data.header.sr is equal import.sr -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_resp -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_resp_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data] = pspm_get_resp(import) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Test -\end_layout - -\begin_layout Standard -Function name: test(this) -\begin_inset Newline newline -\end_inset - -Description: Test if all fields are returned correctly -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -Test if data.data is equal import.data -\end_layout - -\begin_layout Enumerate -Test if data.header.chantype is β€˜resp’ -\end_layout - -\begin_layout Enumerate -Test if data.header.units is equal import.units -\end_layout - -\begin_layout Enumerate -Test if data.header.sr is equal import.sr -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_scr -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_scr_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data] = pspm_get_scr(import) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Standard -There are three test functions. - One for the case that no transfer parameters are defined, one for the case - that the transfer parameters are defined in a struct and one for the case - that they are defined in a .mat file. - They are all performing the following tests, plus eventually some individual - tests -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -Test if the field data.data exists -\end_layout - -\begin_layout Enumerate -Test if the field data.data is not empty -\end_layout - -\begin_layout Enumerate -Test if the field data.header.units exists -\end_layout - -\begin_layout Enumerate -Test if the field data.header.sr exists -\end_layout - -\begin_layout Enumerate -Test if the field data.header.chantype exists -\end_layout - -\begin_layout Enumerate -Test if data.header.sr is equal import.sr -\end_layout - -\begin_layout Enumerate -Test if data.header.chantype is β€˜scr’ -\end_layout - -\begin_layout Subsubsection* -No transfer parameters -\end_layout - -\begin_layout Standard -Function name: no_transferparams(testCase) -\begin_inset Newline newline -\end_inset - -Description: Test if all fields are returned correctly, if no transfer parameter -s are defined. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Additional Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -No additional tests -\end_layout - -\begin_layout Subsubsection* -Struct transfer parameters -\end_layout - -\begin_layout Standard -Function name: stuct_transferparams(testCase) -\begin_inset Newline newline -\end_inset - -Description: Test if all fields are returned correctly, if the transfer - parameters are defined in a struct. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Additional Tests: -\end_layout - -\begin_layout Enumerate -Check for warning if the conversion constant (import.transfer.c) is not defined -\end_layout - -\begin_layout Enumerate -Checks that there are no warnings if import.transfer.Rs or import.transfer.offset - is not defined. - -\end_layout - -\begin_layout Subsubsection* -File transfer parameters -\end_layout - -\begin_layout Standard -Function name: file_transferparams(testCase) -\begin_inset Newline newline -\end_inset - -Description: Test if all fields are returned correctly, if the transfer - parameters are defined in a .mat file. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Additional Tests: -\end_layout - -\begin_layout Enumerate -Check for warning if the transfer parameter file doesn’t exist. - -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_timing -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_timing_test -\begin_inset Newline newline -\end_inset - -Function: -\begin_inset Newline newline -\end_inset - -[sts, multi] = pspm_get_timing('onsets', intiming, timeunits) -\begin_inset Newline newline -\end_inset - -[sts, events] = pspm_get_timing('markervalues', markerinfo, names) -\begin_inset Newline newline -\end_inset - -[sts, epochs] = pspm_get_timing('epochs', epochs) -\begin_inset Newline newline -\end_inset - -[sts, events] = pspm_get_timing('events', events) -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input arguments -\end_layout - -\begin_layout Standard -Function name: invalid_inputargs(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('epochs') [missing input var] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('onsets', 'str') [no timeunits var] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('foo') [unknown format] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('onsets', intiming, 'samples') [two sessions with nonmatching - number of conditions] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:number_of_elements_dont_match -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('onsets', intiming, 'samples') [two sessions with nonmatching - condition names] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:event_names_dont_match -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('onsets', intiming, 'samples') [intiming.onsets{1} is no - numeric vector] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:no_numeric_vector -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('epochs', fn_mat, 'samples') [epochs is not an integer array] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:no_integers -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('markervalues', markerinfo) [no markervalue and no name - ] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('markervalues', markerinfo, markervalue, names) [markervalue - is not of numeric type nor a cell array] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing('markervalues', markerinfo, markervalue, names) [markervalue - and names are not of the same length] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Case Epochs -\end_layout - -\begin_layout Standard -Function name: case_epochs(this) -\begin_inset Newline newline -\end_inset - -Description: Checks the function in β€˜epochs’ mode. - -\begin_inset Newline newline -\end_inset - -Function: [sts, epochs] = pspm_get_timing('epochs', epochs) -\end_layout - -\begin_layout Subsubsection* -Test 1 (matfile input) -\end_layout - -\begin_layout Standard -Input: mat file with variable: epochs = [1 4; 2 5; 3 6] -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Check if sts==1 and if the return value is equal the input array. - -\end_layout - -\begin_layout Subsubsection* -Test 2 (spm input) -\end_layout - -\begin_layout Standard -Input: mat file with variable: onsets{1} = [1 2 3]';onsets{2} = [4 5 6]'; - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Check if sts==1 and if the return value is equal [onsets{1}, onsets{2}]. - -\end_layout - -\begin_layout Subsubsection* -Test 3 (textfile input) -\end_layout - -\begin_layout Standard -Input: textfile with variable: epochs = [1 4; 2 5; 3 6] -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Check if sts==1 and if the return value is equal the input array. - -\end_layout - -\begin_layout Subsubsection* -Test 4 (matrix input) -\end_layout - -\begin_layout Standard -Input: matrix: epochs = [1 4; 2 5; 3 6] -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Check if sts==1 and if the return value is equal the input array. - -\end_layout - -\begin_layout Subsubsection* -Case onsets -\end_layout - -\begin_layout Standard -Function name: case_onsets(this) -\begin_inset Newline newline -\end_inset - -Description: Checks the function in β€˜onsets’ mode. - -\begin_inset Newline newline -\end_inset - -Function: [sts, multi] = pspm_get_timing('onsets', intiming, timeunits) - -\end_layout - -\begin_layout Subsubsection* -Test 1 -\end_layout - -\begin_layout Standard -Input: mat file with the variables: -\begin_inset Newline newline -\end_inset - -names = {'name1', 'name2'}; -\begin_inset Newline newline -\end_inset - -onsets = {[1 2], [3 4]}; -\begin_inset Newline newline -\end_inset - -pmod.name = {'name3', 'name4'}; -\begin_inset Newline newline -\end_inset - -pmod.param = {[2 3], [4 5]}; -\begin_inset Newline newline -\end_inset - -pmod.poly = {2, 2}; -\begin_inset Newline newline -\end_inset - -save(fn_mat, 'names', 'onsets', 'pmod'); -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Function call: -\begin_inset Newline newline -\end_inset - -[sts, outtiming] = pspm_get_timing('onsets', fn_mat, 'samples'); -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - -Check if sts==1, if onsets and names are unchanged and if -\begin_inset Newline newline -\end_inset - -outtiming.pmod.param == {[2 3], [4 9], [4 5], [16 25]} -\end_layout - -\begin_layout Subsubsection* -Test 2 -\end_layout - -\begin_layout Standard -Input: -\begin_inset Newline newline -\end_inset - -mat file with the variables: names = {'name1', 'name2'}; -\begin_inset Newline newline -\end_inset - -onsets = {[1 2 3], [3 4 5]}; durations = {[3 4 5]', [5 6 7]'}; -\begin_inset Newline newline -\end_inset - -pmod.name = {'name3', 'name4'}; -\begin_inset Newline newline -\end_inset - -pmod.param = {[2 3 4], [4 5 6]}; -\begin_inset Newline newline -\end_inset - -pmod.poly = {2, 1}; -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Function call: -\begin_inset Newline newline -\end_inset - -[sts, outtiming] = pspm_get_timing('onsets', fn_mat, 'samples'); -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - -Check if sts==1, if onsets,names and durations are unchanged and if -\begin_inset Newline newline -\end_inset - -outtiming.pmod.param == {[2 3 4], [4 9 16], [4 5 6]} -\end_layout - -\begin_layout Subsubsection* -Case events -\end_layout - -\begin_layout Standard -Function name: case_events(this) -\begin_inset Newline newline -\end_inset - -Description: Checks the function in β€˜events’ mode. - -\begin_inset Newline newline -\end_inset - -Function: [sts, epochs] = pspm_get_timing('events', events) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Check the function if input is a one element cell array and a multiple element - cell array. - Check for warnings (ID:invalid_vector_size) if elements have more than - two columns and if not all elements have the same number of rows. -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_ -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -The datatype import functions are all tested in a similar way. - The individual testclasses must inherit the class β€˜pspm_get_superclass’, - from which they inherit the main test function β€˜valid_datafile’. - They also have to implement the property β€˜fhandle’, which is a function - handle to the specific import function. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -The tests are performed with the sampledata files that are listed in the - SampleDataMasterList.docx file (as at 18.11.2013). - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Superclass: pspm_get_superclass -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testclasses: pspm_get_acq_test -\begin_inset Newline newline -\end_inset - -pspm_get_acqmat_test -\begin_inset Newline newline -\end_inset - -pspm_get_biograph_test -\begin_inset Newline newline -\end_inset - -pspm_get_biosemi_test -\begin_inset Newline newline -\end_inset - -pspm_get_biotrace_test -\begin_inset Newline newline -\end_inset - -pspm_get_brainvis_test -\begin_inset Newline newline -\end_inset - -pspm_get_edf -\begin_inset Newline newline -\end_inset - -pspm_get_labchartmat_ext_test -\begin_inset Newline newline -\end_inset - -pspm_get_labchartmat_in_test -\begin_inset Newline newline -\end_inset - -pspm_get_mat_test -\begin_inset Newline newline -\end_inset - -pspm_get_obs_test -\begin_inset Newline newline -\end_inset - -pspm_get_spike_test -\begin_inset Newline newline -\end_inset - -pspm_get_superclass -\begin_inset Newline newline -\end_inset - -pspm_get_txt_test -\begin_inset Newline newline -\end_inset - -pspm_get_vario_test -\begin_inset Newline newline -\end_inset - -pspm_get_eyelink_test -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Function: [sts, import, sourceinfo] = pspm_get_(datafile, import) - -\end_layout - -\begin_layout Subsubsection -Notes -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Subsubsection* -define testcases -\end_layout - -\begin_layout Standard -In this method the testcases are defined and the testdata is generated (if - needed). - Each testcase is a cell in the cellarray β€˜testcases’. - Each testcase has the following fields: -\end_layout - -\begin_layout Itemize -.pth: the path to the samplefile -\end_layout - -\begin_layout Itemize -.import: the input variable -\end_layout - -\begin_layout Standard -For datatypes which support blocks there has to be an additional field: -\end_layout - -\begin_layout Itemize -.numofblocks -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Valid datafile -\end_layout - -\begin_layout Standard -Function name: valid_datafile(this) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: The main test function, for tests with valid inputdata. - It tests all testcases equally. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test if β€˜sts’ is equal 1. -\end_layout - -\begin_layout Enumerate -If the datatype supports blocks, test if the number of blocks is correct. -\end_layout - -\begin_layout Enumerate -Test if number of elements of the returned β€˜import’ variable is correct. -\end_layout - -\begin_layout Enumerate -Test if each importjob has a field β€˜data’, that is a numeric vector. -\end_layout - -\begin_layout Enumerate -Test if each importjob has a field β€˜sr’, that is a number. -\end_layout - -\begin_layout Enumerate -Test if each importjob has a field β€˜type’. -\end_layout - -\begin_layout Enumerate -Test if all event importjobs have a field β€˜marker’. -\end_layout - -\begin_layout Enumerate -Test if all importjobs have duration below 1h. -\end_layout - -\begin_layout Enumerate -Test if all importjobs have a samplerate between 1 and 10000 for continuous - channels or between 10^-6 and 1 for timestamp channels. - -\end_layout - -\begin_layout Subsubsection* -invalid datafile -\end_layout - -\begin_layout Standard -Function name: invalid_datafile(this) -\begin_inset Newline newline -\end_inset - -Description: The main test function, for tests with invalid inputdata. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -If the datatype supports multiple channels: Check for warning when trying - to import a channel, that is not contained in the file ('ID:channel_not_contain -ed_in_file'). - -\end_layout - -\begin_layout Subsection -Testcases: pspm_get_acq -\end_layout - -\begin_layout Standard -In this section we describe the testcases specific to pspm_get_acq apart - from generic pspm_get tests. -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_get_acq_test -\begin_inset Newline newline -\end_inset - -Function: [tss, import, sourceinfo] = pspm_get_acq(datafile, import) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -get_acq should return the exact same data as Acqknowledge exported mat file -\end_layout - -\begin_layout Standard -Function name: get_acq_returns_same_data_as_acqknowledge_exported_mat(this) -\begin_inset Newline newline -\end_inset - -Description: The data obtained by using pspm_get_acq should be identical - with the data obtained by using export .mat file functionality in Acqknowledge - software. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Load data stored in -\family typewriter -ImportTestData/acq/impedance_acq.acq -\family default - and -\family typewriter -ImportTestData/acq/impedance_mat.mat -\family default - separately. - Then compare the first channel of -\family typewriter -impedance_mat -\family default - with the first channel of data obtained by calling -\family typewriter -pspm_get_acq -\family default - on -\family typewriter -impedance_acq -\family default -. -\end_layout - -\begin_layout Subsection -Testcases: pspm_glm -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_glm_test -\begin_inset Newline newline -\end_inset - -Function: glm = pspm_glm(model, options) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -There are seven testcase functions. - One invalid input arguments test and test 1 to 6. - Tests 1 to 5 are of the same kind. - There are one or multiple testcases per test function, have a look at the - testcase description for more information. - In these tests only Kronecker delta functions are used as basis functions, - furthermore all conditions, pmods and nuisance regressors are pairwise - orthogonal. - The data is also not down sampled and not filtered. - With these limitations it’s easy to calculate the data vectors and the - expected stats. - For each testcase it is then tested: -\end_layout - -\begin_layout Itemize -If numel(glm.names) has the expected value. -\end_layout - -\begin_layout Itemize -If numel(glm.stats) has the expected value. -\end_layout - -\begin_layout Itemize -If glm.stats has the expected value (with a tolerance of 1%). -\end_layout - -\begin_layout Standard -In test 6 the default basis functions are used, and not all conditions and - pmods are orthogonal. - The data is down sampled and low and high pass filtered. - In exchange the stats are not tested for correct values, just for the correct - number of elements. - The properties 'shiftbf' and 'norm' are TestParameters, which means that - this testclass is parameterized. - All functions implmementing these parameters (Test 1 to Test 5) are called - several times with all the different values and combinations of the mentioned - parameters. -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input arguments -\end_layout - -\begin_layout Standard -Function name: invalid_input (this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) [no timeunits field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) [no timeunits var] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with model.timeunits = β€˜foo’ [no valid timeunits field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with model.timing = zeros(10,2) [no valid timing field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with model.modality = 'foo' [no valid modality field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with model.channel = 'scr' [no valid channel field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with model.norm = 'no' [no valid norm field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with model.filt.down = 'none' [filt.down is not numeric] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with model.bf.fhandle = 'foohandle' [non existing bf] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_fhandle -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with numel(model.datafile) != numel(model.timing) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:number_of_elements_dont_match -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with model.missing is struct [non valid missing field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with numel(model.datafile) != numel(model.missing) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:number_of_elements_dont_match -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with model.nuisance is struct [non valid nuisance field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with numel(model.datafile) != numel(model.nuisance) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:number_of_elements_dont_match -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with no R variable in the nuisance file -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm(model) with R variable in the nuisance file that has not the same - length as the datafile -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:number_of_elements_dont_match -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Test 1 -\end_layout - -\begin_layout Standard -Function name: test1(this, shiftbf) -\begin_inset Newline newline -\end_inset - -Description: Basic test with one basis function, one session, no nuisance - regressors, no missings and one condition. - Timeunits are seconds. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testcases: -\end_layout - -\begin_layout Enumerate -no pmods -\end_layout - -\begin_layout Enumerate -one pmod -\end_layout - -\begin_layout Enumerate -two pmods -\end_layout - -\begin_layout Subsubsection* -Test 2 -\end_layout - -\begin_layout Standard -Function name: test2(this, shiftbf) -\begin_inset Newline newline -\end_inset - -Description: Test with one basis function, one session, no nuisance regressors, - no missings and two conditions. - Timeunits are seconds. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testcases: -\end_layout - -\begin_layout Enumerate -no pmods -\end_layout - -\begin_layout Enumerate -first condition: no pmods; second condition: one pmod -\end_layout - -\begin_layout Enumerate -first condition: one pmod; second condition: two pmods -\end_layout - -\begin_layout Subsubsection* -Test 3 -\end_layout - -\begin_layout Standard -Function name: test3(this, shiftbf) -\begin_inset Newline newline -\end_inset - -Description: Test with one basis function, one session, two nuisance regressors - (1Hz cosinus, 1Hz sinus), no missings, one condition and no pmods. - Timeunits are seconds. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testcases: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Only one testcase. - -\end_layout - -\begin_layout Subsubsection* -Test 4 -\end_layout - -\begin_layout Standard -Function name: test4(this, shiftbf) -\begin_inset Newline newline -\end_inset - -Description: Test with one basis function, two sessions, no nuisance regressors, - no missings and one condition. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testcases: -\end_layout - -\begin_layout Enumerate -timeunits are seconds -\end_layout - -\begin_layout Enumerate -timeunits are samples -\end_layout - -\begin_layout Enumerate -timeunits are markers -\end_layout - -\begin_layout Subsubsection* -Test 5 -\end_layout - -\begin_layout Standard -Function name: test5(this, shiftbf) -\begin_inset Newline newline -\end_inset - -Description: Test with two basis functions, one session, no nuisance regressors - and one condition. - Timeunits are seconds. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testcases: -\end_layout - -\begin_layout Enumerate -no missings -\end_layout - -\begin_layout Enumerate -with missings -\end_layout - -\begin_layout Subsubsection* -Test 6 -\end_layout - -\begin_layout Standard -Function name: test6(this) -\begin_inset Newline newline -\end_inset - -Description: Test with default basis function and non-orthogonal conditions - and pmods -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testcase: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Default basis functions, no nuisance regressors, no missings, two sessions - and two conditions. - Timeunits are seconds. -\end_layout - -\begin_layout Itemize -first condition: two pmods (with pmod(1).poly{1} = 2 and pmod(1).poly{2} = - 3) -\end_layout - -\begin_layout Itemize -second condition: no pmods -\end_layout - -\begin_layout Subsubsection* -Test7: -\end_layout - -\begin_layout Standard -Function name: test_extract_missing(this, cutoff, nan_percent) -\begin_inset Newline newline -\end_inset - -Description: Test with one basis function, one session, no nuisance regressors, - no missings and three conditions. - Timeunits are seconds. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testcases: for all combinations of the test parameters cutoff and nan_percent -\end_layout - -\begin_layout Itemize -glm vector stats_missing has the appropriate length according to the number - of conditions -\end_layout - -\begin_layout Itemize -percentages in glm vector stats_missing contains the expected value -\end_layout - -\begin_layout Itemize -glm vector stats_exclude has the appropriate length according to the number - of conditions -\end_layout - -\begin_layout Itemize -glm vector stats_exclude contains the expected condistion which should be - excluded -\end_layout - -\begin_layout Subsection -Testcases: pspm_import -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_import_test -\begin_inset Newline newline -\end_inset - -Function: outfile = pspm_import(datafile, datatype, import, options) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input arguments -\end_layout - -\begin_layout Standard -Function name: invalid_inputargs(ths) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Test No. -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_import(datafile, datatype) [no import variable] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_import(datafile, datatype, β€˜foo’) [no cell/struct import var.] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_import(datafile, β€˜foo’, import) [invalid channeltype] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_channeltype -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_import(5, datatype, import) [no char filename] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Invalid import variable structure -\end_layout - -\begin_layout Standard -Function name: invalid_import_struct(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the structure of the import variable - is invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Test No. -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Multiple channel, though not supported -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_import_struct -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Not allowed channeltype -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_import_struct -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -No sr given, though autosr is not supported -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_import_struct -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Nonexistent file -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:nonexistent_file -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -One datafile -\end_layout - -\begin_layout Standard -Function name: one_datafile(this) -\begin_inset Newline newline -\end_inset - -Description: Checks the function, if datafile is a string (import of one - datafile) and all inputs are correct. - The outfile is checked with the pspm_load_data function. - The tests are performed with a spike samplefile and a labchartmat_in samplefile - (to check the handling of blocks). - -\end_layout - -\begin_layout Subsubsection* -Multiple datafiles -\end_layout - -\begin_layout Standard -Function name: multiple_datafiles(this) -\begin_inset Newline newline -\end_inset - -Description: Checks the function, if datafile is a cell array of strings - (import of multiple datafiles) and all inputs are correct. - The outfiles are tested with the pspm_load_data function. - -\end_layout - -\begin_layout Subsection -Testcases: pspm_interpolate -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_interpolate_test -\begin_inset Newline newline -\end_inset - -Function: [sts, outdata] = pspm_interpolate(indata, options) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -This test class is parameterized. - The test data is generated by the function itself and when needed, files - will be written to datafile.mat. -\end_layout - -\begin_layout Subsubsection* -Test parameters -\end_layout - -\begin_layout Standard -These are parameters which define what kind of data should be passed to - pspm_interpolate and which options should be set. -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Amount -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Specifies how many elements indata (for pspm_interpolate) should have. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Datatype -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Specifies what type of data should be generated. -\end_layout - -\begin_layout Itemize -struct - a valid data struct will be generated -\end_layout - -\begin_layout Itemize -inline - a numeric vector will be generated -\end_layout - -\begin_layout Itemize -file - a valid scr file will be generated -\end_layout - -\begin_layout Itemize -all - all types will sequentially be generated until amount is reached -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Chans -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -If datatype is not inline this specifies how many and which type of data - channels the generated data should have. - In a second field it also defines which of these channels should be interpolate -d (this will be passed later in options.channels). -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Nan method -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Specifies how NaN values will be put into the data. -\end_layout - -\begin_layout Itemize -start - range is 1+offset: -\end_layout - -\begin_layout Itemize -center - range is : -\end_layout - -\begin_layout Itemize -end - range is :end-offset -\end_layout - -\begin_layout Plain Layout -The offset is 1 if 'extrap' is not defined. - This is needed because if there is no data at the end or beginning of the - data, the function is unable to interpolate (unless extrapolation is activated). -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Extrap -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Is either true or false and activates or deactivates the extrapolation. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Interp method -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Specifies the interpolation method. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Newfile -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -True or false and tells the function to either create a file or add the - data as new channel. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Overwrite -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -True or false and tells the function to either overwrite an existing file - or not. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -Replace channel -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -True or false and tells the function to either replace the given channels - with the interpolated data or to add the interpolated data as new channel. -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Test No. -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate() [no arguments] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:missing_data -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate({{}}) [data is not char, struct, numeric] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate({}) [data empty] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:missing_data -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(struct()) [invalid struct] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(invalid_data) [file which does not exist] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:nonexistent_file -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(valid_data, options) [options.channels is larger than valid_data -] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(valid_data, options) [options.channels is not numeric] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(valid_data, options) [options.method is invalid] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -9 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(valid_data, options) [options.newfile is invalid] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -10 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(valid_data, options) [options.extrapolate is invalid] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -11 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(valid_data, options) [options.overwrite is invalid] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -12 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(valid_data, options) [options.dont_ask_overwrite is invalid] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -13 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(valid_data, options) [options.replace_channels is invalid] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -14 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(invalid_data, options) [try to interpolate an events channel] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_channeltype -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -15 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(invalid_data) [try to interpolate with nan from beginning - and without extrapolation] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:option_disabled -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -16 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(invalid_data, options) [try to interpolate with nan from - beginning and with extrapolation] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:out_of_range -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -17 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(invalid_data) [try to interpolate with nan from end and - without extrapolation] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:option_disabled -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -18 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate(invalid_data, options) [try to interpolate with nan from - end and with extrapolation] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:out_of_range -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Test datatypes -\end_layout - -\begin_layout Standard -Function name: test_datatypes(this, datatype, amount, chans) -\begin_inset Newline newline -\end_inset - -Description: Tries to interpolate with different datatypes, amount of data, - channels. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with datatype, amount, 'center', chans, false -\end_layout - -\begin_layout Enumerate -Test if function issues no warnings -\end_layout - -\begin_layout Enumerate -Test if sts is 1 -\end_layout - -\begin_layout Enumerate -Test if size of outdata equals the size of the data -\end_layout - -\begin_layout Enumerate -Test if channels to be interpolated have no more NaNs -\end_layout - -\begin_layout Enumerate -Test if channels not to be interpolated still contain NaNs -\end_layout - -\begin_layout Subsubsection* -Test interpolation variations -\end_layout - -\begin_layout Standard -Function name: test_interpolation_variations(this, interp_method, extrap, - nan_method) -\begin_inset Newline newline -\end_inset - -Description: Tries to interpolate with different interpolation methods while - varying options.extrapolate and the nan_method. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with 'inline', 1, nan_method, {{'scr'}, []}, extrap -\end_layout - -\begin_layout Enumerate -Test if function issues no warnings -\end_layout - -\begin_layout Enumerate -Test if sts is 1 -\end_layout - -\begin_layout Enumerate -Test if size of outdata equals the size of the data -\end_layout - -\begin_layout Enumerate -Test if data has no more NaNs -\end_layout - -\begin_layout Standard - -\series bold -\shape italic -Special case: -\series default -\shape default - When extrapolation is on and nan_method is 'start' and interp_method is - 'previous' or nan_method is 'end' and interp_method is 'next'. - This should issue a warning because this is not possible (e.g. - interpolate with previous value when first NaN value is at the beginning - of the data set). -\end_layout - -\begin_layout Enumerate -Generate data as above -\end_layout - -\begin_layout Enumerate -Test if function issues a warning. -\end_layout - -\begin_layout Subsubsection* -Test no nan -\end_layout - -\begin_layout Standard -Function name: test_no_nan(this) -\begin_inset Newline newline -\end_inset - -Description: Test whether function works even if there is nothing to interpolate. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data struct() with pspm_test_data_gen() -\end_layout - -\begin_layout Enumerate -Test if function issues no warnings -\end_layout - -\begin_layout Enumerate -Test if sts is 1 -\end_layout - -\begin_layout Enumerate -Test if size of outdata equals the size of data -\end_layout - -\begin_layout Enumerate -Test if outdata equals data -\end_layout - -\begin_layout Enumerate -Test if data has no NaNs -\end_layout - -\begin_layout Subsubsection* -Test write -\end_layout - -\begin_layout Standard -Function name: test_write(this, newfile) -\begin_inset Newline newline -\end_inset - -Description: Vary the option newfile and test whether new file is created - correctly or data is correctly added to a new channel. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with 'file', 2, 'center', {{'scr', 'scr', 'scr'}, [1,3]} , - false -\end_layout - -\begin_layout Enumerate -Test if function issues no warnings -\end_layout - -\begin_layout Enumerate -Test if sts is 1 -\end_layout - -\begin_layout Enumerate -Test if size of outdata equals the size of data -\end_layout - -\begin_layout Enumerate -Test if outdata does not equal data -\end_layout - -\begin_layout Standard -New files only: -\end_layout - -\begin_layout Enumerate -Test if new file exists -\end_layout - -\begin_layout Enumerate -Load old and new file and test if size of data is equal -\end_layout - -\begin_layout Enumerate -Verify that interpolated channels in the new file are NaN free -\end_layout - -\begin_layout Standard -Added to existing file only: -\end_layout - -\begin_layout Enumerate -Test if all returned values are numeric (new channel ids) -\end_layout - -\begin_layout Enumerate -Verify that the added channels are NaN free -\end_layout - -\begin_layout Enumerate -Test if added channels match the size of the original data channels -\end_layout - -\begin_layout Subsubsection* -Test overwrite -\end_layout - -\begin_layout Standard -Function name: test_overwrite(this, overwrite) -\begin_inset Newline newline -\end_inset - -Description: Vary overwrite and test whether files are overwritten or not. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with 'file', 2, 'center', {{'scr', 'scr', 'scr'}, [1,2,3]}, - false -\end_layout - -\begin_layout Enumerate -Create files with expected filenames -\end_layout - -\begin_layout Enumerate -Test if function issues no warning -\end_layout - -\begin_layout Enumerate -Test if sts is 1 -\end_layout - -\begin_layout Enumerate -According to overwrite test if file has been overwritten or not -\end_layout - -\begin_layout Subsubsection* -Test replace channel -\end_layout - -\begin_layout Standard -Function name: test_replace_channel(this, replace_channels) -\begin_inset Newline newline -\end_inset - -Description: Vary replace_channel and test wether channels are overwritten - or not. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with 'file', 2, 'center', {{'scr', 'scr', 'scr'}, [1,2,3]} - , false -\end_layout - -\begin_layout Enumerate -Test if function issues no warnings -\end_layout - -\begin_layout Enumerate -Test if sts is 1 -\end_layout - -\begin_layout Enumerate -Test if size of outdata equals the size of data -\end_layout - -\begin_layout Enumerate -Test if outdata does not equal data -\end_layout - -\begin_layout Enumerate -According to replace_channel test whether returned channel ids correspond - to replaced channels or correspond to added channels. -\end_layout - -\begin_layout Subsubsection -Other methods -\end_layout - -\begin_layout Subsubsection* -Generate data -\end_layout - -\begin_layout Standard -Has all of the Test parameters as parameter implemented and accordingly - generates the data. - It calls put nan to insert NaN values into the data. - The generated data is returned as data to the calling function. - Also all return values are stored in the property testdata (for cleanup - data). -\end_layout - -\begin_layout Subsubsection* -Cleanup data -\end_layout - -\begin_layout Standard -Sits in MethodTeardown and is called once the test class has finished all - tests. - It then removes all the datafiles which can be found in the property 'testdata'. -\end_layout - -\begin_layout Subsubsection* -Verify NaN free -\end_layout - -\begin_layout Standard -Helper function to verify whether the data is NaN free or not. - It copes with two states. - Either a channel should have been interpolated, then it shouldn't contain - any NaN values or a channel should not have been interpolated, then the - channel should still contain NaN values. -\end_layout - -\begin_layout Subsection -Testcases: pspm_load1 -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_load1_test -\begin_inset Newline newline -\end_inset - -Function: [sts, data, mdltype] = pspm_load1(fn, action, savedata, options) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -The datafile fn is referring to a datafile which was generated with pspm_load1_t -est.generate_testdata(this). - The function is part of the test object and generates models for all of - the available model types (defined in settings.first). - The models are created with data generated with pspm_testdata_gen. - Two files belong to each model: model_.mat (fn) - and dummy_.mat (dfn). - The model file on the one hand is the actual model file while on the other - hand, the dummy file is a copy of the model file, used by the test to manipulat -e the test data. -\end_layout - -\begin_layout Subsubsection* -Generated aquisition data (pspm_testdata_gen) -\end_layout - -\begin_layout Standard - -\family typewriter -data{1}.chantype = 'scr'; -\begin_inset Newline newline -\end_inset - -data{2}.chantype = 'hb'; -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\family default -The duration of the channels is 100s. -\end_layout - -\begin_layout Subsubsection* -Generated GLM model -\end_layout - -\begin_layout Standard - -\family typewriter -model.timing{1}.names = {'a';'b';'c'}; -\begin_inset Newline newline -\end_inset - -model.timing{1}.onsets = {[10, 20, 30], [15, 25, 35], [18, 28, 38]}; -\end_layout - -\begin_layout Subsubsection* -Generated DCM & SF model -\end_layout - -\begin_layout Standard - -\family typewriter -model.timing{1} = [10,20; 23,38; 40,70;]; -\begin_inset Newline newline -\end_inset - -model.condition{1}.name = {'a';'b'}; -\begin_inset Newline newline -\end_inset - -model.condition{1}.index = [1;2]; -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid model structure (general) -\end_layout - -\begin_layout Standard -Function: invalid_model_tructure_general(this) -\begin_inset Newline newline -\end_inset - -Description: Tries to pass invalid data structures, and tests for certain - warnings. - Applys to all available modeltypes. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -empty model file -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -missing field 'modelfile' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -missing field 'modeltype' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -missing field 'modality' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -missing field 'stats' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -missing field 'names' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Invalid model structure (specific) -\end_layout - -\begin_layout Standard -Function: invalid_model_structure_general(this) -\begin_inset Newline newline -\end_inset - -Description: Tries to pass invalid data structures, and tests for certain - warnings. - Model specific. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests for GLM: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -field 'stats' is not an n x 1 vector -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -unequal amount of numbers and parameters in field 'stats' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.zscored = 1 & action = 'cond' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests for DCM & SF: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -unequal size for fields in 'trlnames' and rows in 'stats' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -missing field 'trlnames' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -unequal size for fields in 'names' and columns in 'stats' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -action = 'recon' -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests for DCM: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.zscored = 1 & pspm_load1(dfn, 'none', {}, options) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.zscored = 1 & pspm_load1(dfn, 'cond', {}, options) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.zscored = 1 & pspm_load1(dfn, 'stats', {}, options) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests for GLM & SF: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.zscored = 1 & pspm_load1(dfn, 'cond', {}, options) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Action 'none' -\end_layout - -\begin_layout Standard -Function: test_action_none(this) -\begin_inset Newline newline -\end_inset - -Description: Test for all modeltypes if action 'none' matches the expected - behaviour. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Test if returned data is empty. -\end_layout - -\begin_layout Subsubsection* -Action 'stats' -\end_layout - -\begin_layout Standard -Function: test_action_stats(this) -\begin_inset Newline newline -\end_inset - -Description: Test for all modeltypes if action 'stats' matches the expected - behaviour. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests for all: -\end_layout - -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Returned data contains field 'stats' -\end_layout - -\begin_layout Enumerate -Returned data contains field 'names' -\end_layout - -\begin_layout Standard -Tests for DCM & SF: -\end_layout - -\begin_layout Enumerate -Returned data contains field 'trlnames' -\end_layout - -\begin_layout Enumerate -Returned data contains field 'condnames' -\end_layout - -\begin_layout Subsubsection* -Action 'cond' -\end_layout - -\begin_layout Standard -Function: test_action_cond(this) -\begin_inset Newline newline -\end_inset - -Description: Test for all modeltypes if action 'cond' matches the expected - behaviour. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests for all: -\end_layout - -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Returned data contains field 'stats' -\end_layout - -\begin_layout Enumerate -Returned data contains field 'names' -\end_layout - -\begin_layout Standard -Tests for DCM & SF: -\end_layout - -\begin_layout Enumerate -Returned data contains field 'trlnames' -\end_layout - -\begin_layout Enumerate -Returned data contains field 'condnames' -\end_layout - -\begin_layout Subsubsection* -Action 'recon' -\end_layout - -\begin_layout Standard -Function: test_action_recon(this) -\begin_inset Newline newline -\end_inset - -Description: Test for all modeltypes if action 'recon' matches the expected - behaviour. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests for GLM: -\end_layout - -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Returned data contains field 'stats' -\end_layout - -\begin_layout Enumerate -Returned data contains field 'names' -\end_layout - -\begin_layout Standard -Tests for DCM & SF already done in specific structure test. -\end_layout - -\begin_layout Subsubsection* -Action 'savecon' -\end_layout - -\begin_layout Standard -Function: test_action_savecon(this) -\begin_inset Newline newline -\end_inset - -Description: Test for all modeltypes if action 'savecon' matches the expected - behaviour. - Generates a number, passes it within the 'savecon' struct and tests if - the number is returned correctly. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Returned data contains field 'con' -\end_layout - -\begin_layout Enumerate -Field 'con' contains field 'test' -\end_layout - -\begin_layout Enumerate -Field 'con.test' is equal to the randomly generated number -\end_layout - -\begin_layout Subsubsection* -Action 'con' -\end_layout - -\begin_layout Standard -Function: test_action_con(this) -\begin_inset Newline newline -\end_inset - -Description: Test for all modeltypes if action 'con' matches the expected - behaviour. - Tests if the in 'savecon' generated field test is still returned. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Returned data contains field 'con' -\end_layout - -\begin_layout Enumerate -Field 'con' contains field 'test'. -\end_layout - -\begin_layout Subsubsection* -Action 'all' -\end_layout - -\begin_layout Standard -Function: test_action_all(this) -\begin_inset Newline newline -\end_inset - -Description: Test for all modeltypes if action 'all' matches the expected - behaviour. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Returned data is not empty. -\end_layout - -\begin_layout Subsubsection* -Action 'save' -\end_layout - -\begin_layout Standard -Function: test_action_save(this) -\begin_inset Newline newline -\end_inset - -Description: Test for all modeltypes if action 'save' matches the expected - behaviour. - Test with options.overwrite = 1. - Generates random number and writes it into field 'test' in model structure. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Model structure contains field 'test' -\end_layout - -\begin_layout Enumerate -Field 'test' in model structure equals to the randomly generated number. -\end_layout - -\begin_layout Subsubsection* -Options -\end_layout - -\begin_layout Standard -Function: test_options(this) -\begin_inset Newline newline -\end_inset - -Description: Test for all modeltypes if options passed with options structure - cause the expected behaviour. - Does also work with a randomly generated number in .test to - test whether the data is written or not. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests for all: -\end_layout - -\begin_layout Enumerate -dont_ask_overwrite = 1 & overwrite = 0 returns warning ID:not_saving_data - and field 'test' in model struct does not match generated number -\end_layout - -\begin_layout Enumerate -dont_ask_overwrite = 1 & overwrite = 1 field 'test' in returned model struct - does match generated number -\end_layout - -\begin_layout Standard -Tests for DCM (with dont_ask_overwrite = 1 & overwrite = 1): -\end_layout - -\begin_layout Enumerate -zscored = 0 & action = 'stats' -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Returned data.stats is not zscored -\end_layout - -\end_deeper -\begin_layout Enumerate -zscored = 1 & action = 'stats' -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Returned data.stats is zscored -\end_layout - -\end_deeper -\begin_layout Enumerate -zscored = 0 & action = 'cond' -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Basic function test -\end_layout - -\begin_layout Enumerate -Returned data is different when callng with zscroed = 1 & action = 'cond' - (should not zscore, when not specified) -\end_layout - -\end_deeper -\begin_layout Subsubsection -Other methods -\end_layout - -\begin_layout Subsubsection* -Remove testdata -\end_layout - -\begin_layout Standard -Removes all the test data generated by the test class. - It is called once the class is finished with testing. - -\end_layout - -\begin_layout Subsubsection* -Basic function test -\end_layout - -\begin_layout Standard -Is called in each test after the tested function has been called. - It does two checks: -\end_layout - -\begin_layout Itemize -Returned modeltype matches the modeltype stored in the returned model structure -\end_layout - -\begin_layout Itemize -Returned status (sts) equals 1 -\end_layout - -\begin_layout Subsection -Testcases: pspm_load_data -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_load_data_test -\begin_inset Newline newline -\end_inset - -Function: [sts, infos, data, filestruct] = pspm_load_data(fn, chan) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -If not otherwise declared, the input variable fn is referring to a datafile - which was generated with pspm_testdata_gen and consists out of the following - channels: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\family typewriter -data{1}.chantype = 'scr'; -\begin_inset Newline newline -\end_inset - -data{2}.chantype = 'marker'; -\begin_inset Newline newline -\end_inset - -data{3}.chantype = 'hr'; -\begin_inset Newline newline -\end_inset - -data{4}.chantype = 'hb'; -\begin_inset Newline newline -\end_inset - -data{5}.chantype = 'marker'; -\begin_inset Newline newline -\end_inset - -data{6}.chantype = 'resp'; -\begin_inset Newline newline -\end_inset - -data{7}.chantype = 'scr'; -\family default - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -The duration of the channels is 10s. - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input arguments -\end_layout - -\begin_layout Standard -Function name: invalid_inputargs(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_data [no filename] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_data(1) [no char filename] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_data(fn, -1) [neg. - channel no] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_data(fn, β€˜foobar’) [no allowed ch type] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_data(fn, foo) [missing field in foo struct] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_data(fn, {1}) [invalid channel option] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_data(struct) [struct has no infos field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_data(fn, 250) [nonexisting channel] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Invalid datafile -\end_layout - -\begin_layout Standard -Function name: invalid_datafile(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the datafile is invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Test No. -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -non-existent datafile -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:nonexistent_file -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -missing β€˜infos’ variable -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -missing β€˜data’ variable -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -missing β€˜data’ field in β€˜data{2}’ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -missing β€˜header’ field β€˜data{3}’ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -missing β€˜sr’ field in β€˜data{7}.header’ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -data{4} is a nx2 vector (instead of a nx1 vector) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -the length of data{1}.data is incompatible with the duration -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -9 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -An entry of data{2}.data is larger than β€˜duration’ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -10 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -data{5} has an non-existent chantype (β€˜scanner’) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -11 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -duplicates (9) with struct chan input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Return all channels -\end_layout - -\begin_layout Standard -Function name: valid_datafile_0(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks the function, if all channels shall be returned (chan - = 0). - -\end_layout - -\begin_layout Subsubsection* -Return all channels (struct input) -\end_layout - -\begin_layout Standard -Function name: valid_datafile_1(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks the function, if all channels shall be returned (chan - = 0) and the input is a struct. - -\end_layout - -\begin_layout Subsubsection* -Return one channel -\end_layout - -\begin_layout Standard -Function name: valid_datafile_2(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks the function, if only one channel shall be returned - (chan = 2). - -\end_layout - -\begin_layout Subsubsection* -Return one channel -\end_layout - -\begin_layout Standard -Function name: valid_datafile_3(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks the function, if multiple channels shall be returned - (chan = [3 5]). - -\end_layout - -\begin_layout Subsubsection* -Return scr channels -\end_layout - -\begin_layout Standard -Function name: valid_datafile_4(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks the function, if only the scr channels shall be returned. - -\end_layout - -\begin_layout Subsubsection* -Return event channels -\end_layout - -\begin_layout Standard -Function name: valid_datafile_5(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks the function, if only the event channels shall be returned. - -\end_layout - -\begin_layout Subsubsection* -Save data -\end_layout - -\begin_layout Standard -Function name: valid_datafile_6(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks the function, if data is to be saved (chan struct). - -\end_layout - -\begin_layout Subsection -Testcases: pspm_pp -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_pp_test -\begin_inset Newline newline -\end_inset - -Function: newfile = pspm_pp('median', datafile, n, channelnumber) or newfile - = pspm_pp('butter', datafile, freq, channelnumber) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pp('butter', 'file') [no freq] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pp('foo', 'file', 100) [no valid first argument] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pp('butter', 'file', 19) [freq below 20] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Median test -\end_layout - -\begin_layout Standard -Function name: median_test(this) -\begin_inset Newline newline -\end_inset - -Description: Checks medianfilter functionality -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Setup: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testfile with 3 channels (scr, hb, scr). -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Filter one channel [Input: newfile = pspm_pp('median', testfile, 50, 3)] - -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Standard -i. - Check if sts == 1, when data is loaded with pspm_load_data. - -\end_layout - -\begin_layout Standard -ii. - Check if newfile has the same number of channels as testfile -\end_layout - -\end_deeper -\begin_layout Enumerate -Filter multiple channel [Input: newfile = pspm_pp('median', testfile, 50)] - -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Standard -i. - Check if sts == 1, when data is loaded with pspm_load_data. - -\end_layout - -\begin_layout Standard -ii. - Check if newfile has the same number of channels as testfile -\end_layout - -\end_deeper -\begin_layout Subsubsection* -Butterworth filter test -\end_layout - -\begin_layout Standard -Function name: butter_test(this) -\begin_inset Newline newline -\end_inset - -Description: Checks Butterworth filter functionality -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Setup: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Testfile with 3 channels (scr, hb, scr). - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Filter one channel [Input: newfile = pspm_pp('butter', testfile, 40, 3)] - -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Standard -i. - Check if sts == 1, when data is loaded with pspm_load_data. - -\end_layout - -\begin_layout Standard -ii. - Check if newfile has the same number of channels as testfile -\end_layout - -\end_deeper -\begin_layout Enumerate -Filter multiple channel [Input: newfile = pspm_pp('butter', testfile, 40)] - -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Standard -i. - Check if sts == 1, when data is loaded with pspm_load_data. - -\end_layout - -\begin_layout Standard -ii. - Check if newfile has the same number of channels as testfile -\end_layout - -\end_deeper -\begin_layout Subsection -Testcases: pspm_prepdata -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_prepdata_test -\begin_inset Newline newline -\end_inset - -Function: [sts, outdata, newsr] = pspm_prepdata(data, filt) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_prepdata([1 NaN 3], filt) [no NaN values] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_prepdata([1 2 3]) [no filt variable] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_prepdata(data, filt) [filt has no hporder field] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_prepdata('foo', filt) [no numeric data] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_prepdata(data, filt) [with lpfreq = 'foo' (not valid)] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Hipassfilter test -\end_layout - -\begin_layout Standard -Function name: hipassfilter_test(this) -\begin_inset Newline newline -\end_inset - -Description: Checks hipassfilter functionality (without downsampling) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Setup: -\begin_inset Newline newline -\end_inset - -data = rand(1000,1); -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -filt.sr = 100; -\begin_inset Newline newline -\end_inset - -filt.lpfreq = 'none'; -\begin_inset Newline newline -\end_inset - -filt.lporder = 1; -\begin_inset Newline newline -\end_inset - -filt.hpfreq = 20; -\begin_inset Newline newline -\end_inset - -filt.hporder = 1; -\begin_inset Newline newline -\end_inset - -filt.down = 'none'; -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Unidirectional tests [filt.direction = β€˜uni’] -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Standard -i. - Check if sts == 1 -\end_layout - -\begin_layout Standard -ii. - Check if newsr == filt.sr -\end_layout - -\begin_layout Standard -iii. - Check if outdata is empty -\end_layout - -\begin_layout Standard -iv. - Check if length(outdata) == length(data) -\end_layout - -\end_deeper -\begin_layout Enumerate -Unidirectional tests [filt.direction = β€˜bi’] -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Standard -i. - Check if sts == 1 -\end_layout - -\begin_layout Standard -ii. - Check if newsr == filt.sr -\end_layout - -\begin_layout Standard -iii. - Check if outdata is empty -\end_layout - -\begin_layout Standard -iv. - Check if length(outdata) == length(data) -\end_layout - -\end_deeper -\begin_layout Subsubsection* -Lowpassfilter test -\end_layout - -\begin_layout Standard -Function name: lowpassfilter_test(this) -\begin_inset Newline newline -\end_inset - -Description: Checks hipassfilter functionality (without downsampling) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Setup: -\begin_inset Newline newline -\end_inset - -data = rand(1000,1); -\begin_inset Newline newline -\end_inset - -filt.sr = 100; -\begin_inset Newline newline -\end_inset - -filt.lpfreq = 40; -\begin_inset Newline newline -\end_inset - -filt.lporder = 1; -\begin_inset Newline newline -\end_inset - -filt.hpfreq = 'none'; -\begin_inset Newline newline -\end_inset - -filt.hporder = 1; -\begin_inset Newline newline -\end_inset - -filt.down = 'none'; -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Same tests as in hipassfilter_test. - Additionally there is a check for a warning if filt.lpfreq is higher (or - equal) than the nyquist frequency: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_prepdata(data, filt) [filt.sr = 100; filt.lpfreq = 60] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:no_low_pass_filtering -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Bandpassfilter test -\end_layout - -\begin_layout Standard -Function name: bandpassfilter_test(this) -\begin_inset Newline newline -\end_inset - -Description: Checks bandpassfilter functionality (without downsampling) - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Setup: -\begin_inset Newline newline -\end_inset - -data = rand(1000,1); -\begin_inset Newline newline -\end_inset - -filt.sr = 200; -\begin_inset Newline newline -\end_inset - -filt.lpfreq = 99; -\begin_inset Newline newline -\end_inset - -filt.lporder = 1; -\begin_inset Newline newline -\end_inset - -filt.hpfreq = 20; -\begin_inset Newline newline -\end_inset - -filt.hporder = 1; -\begin_inset Newline newline -\end_inset - -filt.down = 'none'; -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: Same tests as in hipassfilter_test. - -\end_layout - -\begin_layout Subsubsection* -Integer samplerate ratio downsampling test -\end_layout - -\begin_layout Standard -Function name: int_sr_ratio_downsample_test(this) -\begin_inset Newline newline -\end_inset - -Description: Checks downsampling functionality, if the ratio between filt.sr - and filt.down is an integer. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Setup: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -ratio = 2; %ratio between filt.sr and filt.down -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -filt.down = 100; -\begin_inset Newline newline -\end_inset - -filt.sr = ratio -\begin_inset Newline newline -\end_inset - -filt.down; filt.lpfreq = 40; -\begin_inset Newline newline -\end_inset - -filt.lporder = 1; -\begin_inset Newline newline -\end_inset - -filt.hpfreq = 'none'; -\begin_inset Newline newline -\end_inset - -filt.hporder = 1; -\begin_inset Newline newline -\end_inset - -filt.direction = 'uni'; -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -data = rand(filt.sr * 10,1); -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Check if sts == 1 -\end_layout - -\begin_layout Enumerate -Check if newsr == filt.down -\end_layout - -\begin_layout Enumerate -Check if outdata is empty -\end_layout - -\begin_layout Enumerate -Check if ratio*length(outdata) == length(data) -\end_layout - -\begin_layout Subsection -Testcases: pspm_process_illuminance -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_process_illuminance_test -\begin_inset Newline newline -\end_inset - -Function: [sts, out] = pspm_process_illuminance(ldata, sr, options) -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -This test class is parameterized. - The test data is generated by the function itself and when needed, files - will be written to datafile.mat. -\end_layout - -\begin_layout Subsubsection* -Test parameters -\end_layout - -\begin_layout Standard -These are parameters which define what kind of data should be passed to - pspm_process_illuminance and which options should be set. -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -bf_dur -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines the duration of the basis function. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -bf_offset -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines the offset of the basis function. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -dur -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines the duration of the generated dataset. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -sr -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines the samplerate of the generated dataset. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -n_times -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines how many datasets should be generated. -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -mode -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines the whether the dataset should be written to a file, kept as inline - variable or should be a mix of both. - Can be either 'file', 'inline' or 'mixed' -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout - -\series bold -overwrite -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Defines whether existing files should be overwritten or not. -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Test No. -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance() [no arguments] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance([]) [empty data] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:missing_data -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance(1:10) [missing samplerate] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance(1:10, 'a') [invalid ssamplerate] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10}, 1) [cell, no cell] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance(1:10, {1}) [no cell, cell] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10, 10:10}, {1}) [different sized cells] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10, 'a'},{1,2}) [invalid file] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:non_existent_file -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -9 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10, 1:10}, {1, 'a'}) [invalid samplerate] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -10 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10}, {1}, 'o') [wrong options] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -11 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10}, {1}, opt)[wrong transfer settings] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -12 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10}, {1}, opt)[wrong duration] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -13 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10}, {1}, opt)[wrong offset] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -14 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10}, {1}, opt)[wrong outputfile] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -15 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10}, {1}, opt)[format of ldata and opt.fn differs] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -16 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance({1:10}, {1}, opt)[opt.overwrite is not boolean] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Test options -\end_layout - -\begin_layout Standard -Function name: test_options(this, sr, dur, bf_dur, bf_offset) -\begin_inset Newline newline -\end_inset - -Description: Tries out different combination options to process the generated - illuminance data. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with sr and dur -\end_layout - -\begin_layout Enumerate -Set options according to bf_dur and bf_offset -\end_layout - -\begin_layout Enumerate -Set expected warning according to sr*dur and sr*bf_dur -\end_layout - -\begin_deeper -\begin_layout Enumerate -expect empty data if sr*dur < 1 -\end_layout - -\begin_layout Enumerate -expect invalid_input if sr*bf_dur < 1 -\end_layout - -\begin_layout Enumerate -otherwise expect no warning -\end_layout - -\end_deeper -\begin_layout Enumerate -Test if issued warning equals expected warning -\end_layout - -\begin_layout Enumerate -Test if sts equals expected value -\end_layout - -\begin_layout Enumerate -Test if amount of data elements of input and output data is equal -\end_layout - -\begin_layout Subsubsection* -Test multi -\end_layout - -\begin_layout Standard -Function name: test_multi(this, n_times, mode) -\begin_inset Newline newline -\end_inset - -Description: Generates n sets of illuminance data and passes it to pspm_process_ -illuminance. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with 10 (sr), 100 (dur), n_times (amount), mode -\end_layout - -\begin_layout Enumerate -Test if pspm_process_illuminance issues no warning -\end_layout - -\begin_layout Enumerate -Test if sts is 1 -\end_layout - -\begin_layout Enumerate -For n_times == 1, test if out has 10*100 data points -\end_layout - -\begin_layout Enumerate -for n_times -\begin_inset space \space{} -\end_inset - -~= 1, test if output has same size as input -\end_layout - -\begin_layout Subsubsection* -Test overwrite -\end_layout - -\begin_layout Standard -Function name: test_overwrite(this, overwrite) -\begin_inset Newline newline -\end_inset - -Description: Generate illuminance file and test overwrite behaviour. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Generate data with 10 (sr), 100 (dur), 1 (amount), 'file' -\end_layout - -\begin_layout Enumerate -Test if pspm_process_illuminance issues no warning -\end_layout - -\begin_layout Enumerate -Test if sts equals 1 -\end_layout - -\begin_layout Enumerate -Test if existing file was overwriten or not -\end_layout - -\begin_layout Subsubsection -Other methods -\end_layout - -\begin_layout Subsubsection* -Generate lx -\end_layout - -\begin_layout Standard -Has some of the Test parameters as parameter implemented and accordingly - generates the lx data. - According to the calling arguments the output is a cell of files and data - vectors. - All generated files will be stored in the property 'datafiles'. - They will be removed once all tests have finished. -\end_layout - -\begin_layout Subsubsection* -Cleanup -\end_layout - -\begin_layout Standard -Located in MethodTeardown and is called once the test class has finished - all tests. - It then removes all the datafiles which can be found in the property 'datafiles -'. -\end_layout - -\begin_layout Subsection -Testcases: pspm_pulse_convert -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_pulse_convert_test -\begin_inset Newline newline -\end_inset - -Function: wavedata = pspm_pulse_convert(pulsedata, resamplingrate, samplingrate) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input(testCase) -\begin_inset Newline newline -\end_inset - -Description: Pass invalid input arguments and test if the error message - is correct. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pulse_convert() -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pulse_convert(10^-3 * (1:10000)') -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pulse_convert(10^-3 * (1:10000)', 10000) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Valid input -\end_layout - -\begin_layout Standard -Function name: valid_input(testCase) -\begin_inset Newline newline -\end_inset - -Description: Pass generated, valid data and test if function issues no warning. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Test function without downsampling the data -\end_layout - -\begin_layout Enumerate -Test function with downsampling the data -\end_layout - -\begin_layout Subsection -Testcases: pspm_ren -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_ren_test -\begin_inset Newline newline -\end_inset - -Function: out_newfilename = pspm_ren(filename, newfilename) -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input (this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ren('fn') [no newfilename] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ren({'fn1', 'fn2'}, {'rfn1', 'rfn2', 'rfn3'}) [non same size cell arrays] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Char Valid Input -\end_layout - -\begin_layout Standard -Function name: char_valid_input (this) -\begin_inset Newline newline -\end_inset - -Description: Checks the function if the input variables are of type char. - It uses pspm_load_data to check the files. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Check if out_newefilename = newfilename -\end_layout - -\begin_layout Enumerate -Check if sts==1 (of pspm_load_data output) -\end_layout - -\begin_layout Enumerate -Check if the field β€˜infos.rendata’ exists -\end_layout - -\begin_layout Enumerate -Check if the field β€˜infos.newname’ exists -\end_layout - -\begin_layout Enumerate -Check if the original file has been deleted -\end_layout - -\begin_layout Subsubsection* -Cell Valid Input -\end_layout - -\begin_layout Standard -Function name: cell_valid_input (this) -\begin_inset Newline newline -\end_inset - -Description: Checks the function if the input variables are of type cell. - It uses pspm_load_data to check the files. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -The inputs are two-element cell arrays. - For both elements the same tests as in the char_valid_input function are - performed individually. -\end_layout - -\begin_layout Subsection -Testcases: pspm_resp_pp -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_resp_pp_test -\begin_inset Newline newline -\end_inset - -Function: sts = pspm_resp_pp(fn, sr, chan, options) -\begin_inset Newline newline -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Regression Test against Revision r660 -\end_layout - -\begin_layout Standard -Function name: compare_results_to_results_obtained_from_r660_version(this) -\begin_inset Newline newline -\end_inset - -Description: In r660, there was a bug found in pspm_resp_pp that caused - it to crash with index out of bounds error on inputs containing some edgecase. - This test specifically checks whether the fixed version returns the same - results as the version before the bugfix on data that didn't cause a crash. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Check if the returned channel types have the same name and ordering -\end_layout - -\begin_layout Enumerate -Check if the returned data is the same -\end_layout - -\begin_layout Subsection -Testcases: pspm_split_sessions -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_split_sessions_test -\begin_inset Newline newline -\end_inset - -Properties: expected_number_of_files = 3; -\begin_inset Newline newline -\end_inset - -Function: newdatafile = pspm_split_sessions(datafile, markerchannel, options) - -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -For the tests a testdatafile with three channels is used (duration is 100s). - The markerchannel data is: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -data = [1 4 9 12 30 31 34 41 43 59 65 72 74 80 89 96]' -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Hence if MAXSN=10 & BRK2NORM=3 (default values) the datafiles should be - split into 3 files. - If different values are being used, update the property β€˜expected_number_of_fil -es’ of the testclass object accordingly. - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input -\end_layout - -\begin_layout Standard -Function name: invalid_input (this) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_split_sessions() [no filename] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_split_sessions (2) [no string filename] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_split_sessions (β€˜fn’, β€˜foo’) [no numeric marker channel no.] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -One datafile -\end_layout - -\begin_layout Standard -Function name: one_datafile(this) -\begin_inset Newline newline -\end_inset - -Description: Checks the function if the variable β€˜datafile’ is of type char - (one datafile). - The markerchannel number is not assigned explicitly. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Check if the file has been split into β€˜expected_number_of_files’ files For - each output file the following tests are performed: -\end_layout - -\begin_layout Enumerate -Check if sts == 1, when data is loaded with pspm_load_data. -\end_layout - -\begin_layout Enumerate -Check if number of channels is correct. -\end_layout - -\begin_layout Enumerate -Check it the field infos.slitdate exists -\end_layout - -\begin_layout Enumerate -Check if the field infos.splitsn exists -\end_layout - -\begin_layout Enumerate -Check if the field infos.splitfile exists. - -\end_layout - -\begin_layout Subsubsection* -Multiple datafiles -\end_layout - -\begin_layout Standard -Function name: multiple_datafiles(this) -\begin_inset Newline newline -\end_inset - -Description: Checks the function if the variable β€˜datafile’ is of type cell - (two datafiles). - The markerchannel number is assigned explicitly. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -For both datafiles the same tests as in the one_datafile function are performed - individually. - Additionally it is tested if the number of input files does match the number - of output files. - -\end_layout - -\begin_layout Subsection -Testcases: pspm_trim -\end_layout - -\begin_layout Subsubsection -Information -\end_layout - -\begin_layout Standard -Testclass: pspm_trim_test -\begin_inset Newline newline -\end_inset - -Function: newdatafile=pspm_trim(datafile, from, to, reference, options) - -\end_layout - -\begin_layout Subsubsection -Setup -\end_layout - -\begin_layout Standard -If not otherwise declared, the input variable fn is referring to a datafile - which was generated with pspm_testdata_gen and consists of the following - channels: -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -data{1}.chantype = 'scr'; -\begin_inset Newline newline -\end_inset - -data{2}.chantype = 'marker'; -\begin_inset Newline newline -\end_inset - -data{3}.chantype = 'hr'; -\begin_inset Newline newline -\end_inset - -data{4}.chantype = 'hb'; -\begin_inset Newline newline -\end_inset - -data{5}.chantype = 'marker'; -\begin_inset Newline newline -\end_inset - -data{6}.chantype = 'resp'; -\begin_inset Newline newline -\end_inset - -data{7}.chantype = 'scr'; -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -The duration of the data recording is 10s. - -\end_layout - -\begin_layout Subsubsection -Testcases -\end_layout - -\begin_layout Subsubsection* -Invalid input arguments -\end_layout - -\begin_layout Standard -Function name: invalid_inputargs(testCase) -\begin_inset Newline newline -\end_inset - -Description: Checks for warnings, if the input arguments are invalid. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\begin_inset Newline newline -\end_inset - - -\begin_inset Tabular - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_trim(testCase.fn, [1 2], 5, 'marker') [invalid from parameter] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_trim(testCase.fn, 0, 'bla', 'marker') [invalid to parameter] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_trim(testCase.fn, 0, '[]', 'marker') [invalid to parameter] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_trim(fn, 0, 5) [no reference] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_trim(fn, 0, 5, 6) [no char or 2-element numeric reference] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_trim(fn, 0, 5, β€˜bla’) [invalid char reference] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_trim(fn, 0, 5, [-1 5]) [invalid numeric start reference] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_trim(fn, 0, 5, [5 4]) [invalid numeric start/end reference] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection -Reference = β€˜marker’ tests -\end_layout - -\begin_layout Standard -Function name: marker_tests(testCase) -\begin_inset Newline newline -\end_inset - -Description: A wrapper function for tests with reference = β€˜marker’. - It executes the methods markertest_k, where the testcases are defined. - -\end_layout - -\begin_layout Subsubsection* -markertest_1 -\end_layout - -\begin_layout Standard -Description: from and to are set so that the trimming points are out of - the range [0,duration]. - Hence the data should not be trimmed. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Expected warning: ID: marker_out_of_range -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Input: pspm_trim(fn, -20, 20, ’marker’) -\end_layout - -\begin_layout Subsubsection* -markertest_2 -\end_layout - -\begin_layout Standard -Description: from and to are set so that the trimming points are exactly - (0, duration). - Hence the data should not be trimmed. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Input: from = -1 * marker(1) to = duration - marker(end) pspm_trim(fn, from, - to, ’marker’) -\end_layout - -\begin_layout Subsubsection* -markertest_3 -\end_layout - -\begin_layout Standard -Description: from and to are set so that the trimming points in the range - [0,duration]. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Input: pspm_trim(fn, 1, -2, ’marker’) -\end_layout - -\begin_layout Subsubsection -Reference = β€˜file’ tests -\end_layout - -\begin_layout Standard -Function name: file_tests(testCase) -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Description: A wrapper function for tests with reference = β€˜file’. - It executes the methods filetest_k, where the testcases are defined. - -\end_layout - -\begin_layout Subsubsection* -filetest_1 -\end_layout - -\begin_layout Standard -Description: from and to are set so that the trimming points are out of - the range [0,duration]. - Hence the data should not be trimmed. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Expected warning: ID: marker_out_of_range -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Input: pspm_trim(fn, -12.5, 50, ’marker’) -\end_layout - -\begin_layout Subsubsection* -filetest_2 -\end_layout - -\begin_layout Standard -Description: from and to are set so that the trimming points are exactly - (0, duration). - Hence the data should not be trimmed. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Input: pspm_trim(fn, 0 , duration, ’marker’) -\end_layout - -\begin_layout Subsubsection* -filetest_3 -\end_layout - -\begin_layout Standard -Description: from and to are set so that the trimming points in the range - [0,duration]. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Input: pspm_trim(fn,2.1, duration – 2.5, ’marker’) -\end_layout - -\begin_layout Subsubsection* -Numeric reference tests -\end_layout - -\begin_layout Standard -Function name: num_tests(testCase) -\begin_inset Newline newline -\end_inset - -Description: A wrapper function for tests with reference = [a b] (a, b are - two integers with a - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Input -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Expected warning -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_write_channel() [no parameter] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_write_channel(1) [fn is a number] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_write_channel('some_file', []) [no action passed] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:unknown_action -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_write_channel('some_file', [], '') [empty action passed] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:unknown_action -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.channel = 'some invalid channel' -\end_layout - -\begin_layout Plain Layout -pspm_write_channel('some_file', [], 'add', options) [invalid channel] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.channel = -1 -\end_layout - -\begin_layout Plain Layout -pspm_write_channel('some_file', [], 'add', options) [negative channel] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.channel = 0 -\end_layout - -\begin_layout Plain Layout -pspm_write_channel('some_file', [], 'delete', options) [no channel and no - data given] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.channel = 0 -\end_layout - -\begin_layout Plain Layout -pspm_write_channel('some_file', [], 'add', options) [empty newdata] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.channel = 0 -\end_layout - -\begin_layout Plain Layout -pspm_write_channel('some_file', 1:3, 'add', options) [newdata is not cell - and not struct] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.channel = 1:5 -\end_layout - -\begin_layout Plain Layout -pspm_write_channel(this.testdatafile, [], 'delete', options) [more given - channels than in file exist] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_input -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -options.channel = 'ecg'; pspm_write_channel(this.testdatafile, [], 'delete', - options) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:no_matching_channels -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_write_channel(this.testdatafile, gen_data.data{1}, 'add') [generated - data has the wrong format (two rows in one channel)] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -ID:invalid_data_structure -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Subsubsection* -Action 'add' -\end_layout - -\begin_layout Standard -Function name: test_add(this) -\begin_inset Newline newline -\end_inset - -Description: Checks if action 'add' behaves as expected. - A new channel with chantype = 'hb', sr = 200 and duration = 500 is generated. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Load condition before and after and pass it to 'Verify write' -\end_layout - -\begin_layout Subsubsection* -Action 'add transposed' -\end_layout - -\begin_layout Standard -Function name: test_add_transposed(this) -\begin_inset Newline newline -\end_inset - -Description: Checks if action 'add' behaves as expected, when data has the - wrong dimensions. - A new channel with chantype = 'rs', sr = 200 and duration = 500 is generated. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Transpose generated data -\end_layout - -\begin_layout Enumerate -Load condition before and after and pass it to 'Verify write' -\end_layout - -\begin_layout Subsubsection* -Action 'replace'/'add' -\end_layout - -\begin_layout Standard -Function name: test_replace_add(this) -\begin_inset Newline newline -\end_inset - -Description: Checks if action 'replace' behaves as expected. - A new channel with chantype = 'hr', sr = 10 and duration = 500 is generated. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Running pspm_write_channel with action = 'replace' should issue 'ID:no_matching_ -channels' (channeltype should not exist before) and then instead add the - channel -\end_layout - -\begin_layout Enumerate -Load condition before and after and pass it to 'Verify write' -\end_layout - -\begin_layout Subsubsection* -Action 'replace' -\end_layout - -\begin_layout Standard -Function name: test_replace(this) -\begin_inset Newline newline -\end_inset - -Description: Checks if action 'replace' behaves as expected. - A new channel with chantype = 'hr', sr = 20 and duration = 500 is generated. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Load condition before and after and pass it to 'Verify write' -\end_layout - -\begin_layout Enumerate -Test if 'hr' channel has sample rate 20 -\end_layout - -\begin_layout Subsubsection* -Action 'delete' (one channel) -\end_layout - -\begin_layout Standard -Function name: test_delete_single(this) -\begin_inset Newline newline -\end_inset - -Description: Checks if action 'delete' behaves as expected. - In this test only one channel will be deleted. - To test the delete algorithm there will be 7 channels added which are then - also used for test_delete_multi(this). - The particular channels are then identified by the sample rate which correspond -s to the channel id * 10. -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Delete channel with chantype = 'hr' in newdata.header.chantype -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Verify write -\end_layout - -\begin_layout Enumerate -Ensure only one channel has been deleted -\end_layout - -\begin_layout Enumerate -Test if there is no more channel with chantype = 'hr' -\end_layout - -\end_deeper -\begin_layout Enumerate -Delete channel with channel number in options.channel -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Verify Write -\end_layout - -\begin_layout Enumerate -Ensure only one channel has been deleted -\end_layout - -\end_deeper -\begin_layout Enumerate -Test the delete algorithm -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Remove 'resp' channel with options.delete = 'last' -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Verify write -\end_layout - -\begin_layout Enumerate -Ensure only one channel has been deleted -\end_layout - -\begin_layout Enumerate -Test if last channel was deleted -\end_layout - -\end_deeper -\begin_layout Enumerate -Remove 'resp' channel with options.delete = 'first' -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Verify write -\end_layout - -\begin_layout Enumerate -Ensure only one channel has been deleted -\end_layout - -\begin_layout Enumerate -Test if last entry was not deleted -\end_layout - -\end_deeper -\end_deeper -\begin_layout Subsubsection* -Action 'delete' (multiple channels) -\end_layout - -\begin_layout Standard -Function name: test_delete_multi(this) -\begin_inset Newline newline -\end_inset - -Description: Checks if action 'delete' behaves as expected. - In this test only multiple channels will be deleted. - This test relys on the changes made to the testdatafile by other test functions - in this class. - -\begin_inset Newline newline -\end_inset - - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -Delete channel 1 and 2 from testdatafile -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Verify write -\end_layout - -\begin_layout Enumerate -Ensure two channels have been deleted -\end_layout - -\end_deeper -\begin_layout Enumerate -Delete all 'resp' channels from testdatafile -\begin_inset Separator latexpar -\end_inset - - -\end_layout - -\begin_deeper -\begin_layout Enumerate -Verify write -\end_layout - -\begin_layout Enumerate -Test if datafile contains no more 'resp' channels -\end_layout - -\end_deeper -\begin_layout Subsubsection -Other methods -\end_layout - -\begin_layout Subsubsection* -Verify write -\end_layout - -\begin_layout Standard -Is called after pspm_write_channel has been called (action = 'add' or action - = 'replace') and tests if data was written and a new history entry was - made. - -\begin_inset Newline newline -\end_inset - -Tests: -\end_layout - -\begin_layout Enumerate -if action = 'add', test if there is a new channel -\end_layout - -\begin_layout Enumerate -if action = 'replace', test if there is still the same amount of channels -\end_layout - -\begin_layout Enumerate -if action = 'delete', test if there have been as many channels deleted as - given in outinfos.channel -\end_layout - -\begin_layout Enumerate -test if history has a new entry -\end_layout - -\begin_layout Enumerate -search for channels with same chantype as added channel (should be only - one channel) -\end_layout - -\begin_layout Enumerate -test if number of data elements in new channel and added channel is equal -\end_layout - -\begin_layout Enumerate -test if new channel and added channel have same 'sr' -\end_layout - -\begin_layout Section -External functions and tools -\end_layout - -\begin_layout Subsection -VB (Variational Bayes) inversion algorithm by Jean Daunizeau -\end_layout - -\begin_layout Standard -Updated October 2014 -\end_layout - -\begin_layout Standard -Changes made for use in PsPM: -\end_layout - -\begin_layout Itemize - -\emph on -VBA_ReDisplay.m -\emph default -, fixed try-catch syntax in various places by adding a comma after -\begin_inset Quotes eld -\end_inset - -try -\begin_inset Quotes erd -\end_inset - - to avoid warning in matlab > 2007 -\end_layout - -\begin_layout Itemize - -\shape italic -VBA_inv.m -\shape default -, line 42: added warning off/on to suppress the warning -\begin_inset Quotes eld -\end_inset - -Matrix is singular, close to singular or badly scaled. - Results may be inaccurate. - RCOND = NaN. -\begin_inset Quotes erd -\end_inset - - -\end_layout - -\begin_layout Standard -Updated October 2016 -\end_layout - -\begin_layout Standard -Changes made for use in PsPM: -\end_layout - -\begin_layout Itemize - -\emph on -VBA_ReDisplay.m -\emph default -, fixed try-catch syntax in various places by adding a comma after -\begin_inset Quotes eld -\end_inset - -try -\begin_inset Quotes erd -\end_inset - - to avoid warning in matlab > 2007 -\end_layout - -\begin_layout Itemize - -\shape italic -VBA_inv.m -\shape default -, line 48: added warning off/on to suppress the warning -\begin_inset Quotes eld -\end_inset - -Matrix is singular, close to singular or badly scaled. - Results may be inaccurate. - RCOND = NaN. -\begin_inset Quotes erd -\end_inset - - -\end_layout - -\begin_layout Itemize - -\shape italic -VBA_NLStateSpaceModel.m -\shape default -: added resetting warning to preceeding state. -\end_layout - -\begin_layout Section -List of functions -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Name -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Main author -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Test exists -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Test Doc -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -f_SCR -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach & Jean Daunizeau -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -f_SF -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -g_SCR -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -scr -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_align_channels -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_axpos -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_brf -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Saurabh Khemka & Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_FIR -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_Fourier -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_hprf -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_hprf_e -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_hprf_fc -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_hprf_fc_f -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_lcrf_gm -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_ldrf_gm -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_ldrf_gu -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_psrf_fc -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_rarf_e -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_rarf_fc -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_rfrrf_e -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_rprf_e -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_scrf_f -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_scrf -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_spsrf_box -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Laure Ciernik -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_bf_spsrf_gamma -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Laure Ciernik -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_butter -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_compute_visual_angle -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Laure Ciernik -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_con1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_con2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_contrast -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_convert_area2diameter -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_convert_au2mm -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_convert_illum2lum -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_convert_lux2cdm2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_convert_mm2visdeg -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_convert_pixel2unit -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Laure Ciernik -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_convert_unit -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_convert_visangle2sps -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Laure Ciernik -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_data_editor -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_dcm_inv -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_dcm -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_denoise_spike -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_display -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Philipp C Paulus -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_down -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_downsample -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ecg2hb -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Philipp C Paulus -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ecg2hb_amri -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ecg_editor -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_exp -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_extract_segments -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_filtfilt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_channel -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_data_epochs -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_sounds -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Samuel Gerster -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_find_valid_fixations -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_acq_bioread -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_acq -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_acqmat -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_biograph -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_biosemi -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_biotrace -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_blink_l -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_blink_r -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_brainvis -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_cell -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_cnt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_custom -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_ecg -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_edf -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_events -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_eyelink -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Christoph Korn, Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_gaze_x_l -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_gaze_y_l -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_gaze_x_r -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_gaze_y_r -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_hb -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_hp -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_hr -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_labchartmat_ext -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_labchartmat_in -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_marker -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_markerinfo -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_mat -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_obs -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Linus RΓΌttimann -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_physlog -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_pupil -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_pupil_l -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_pupil_r -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_resp -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_rf -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_saccade_l -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Laure Ciernik -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_saccade_r -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Laure Ciernik -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_scr -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_smi -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_sp_speed -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Laure Ciernik -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_spike -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_sound -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_timing -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_txt -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_vario -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_viewpoint -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_wdq -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_get_wdq_n -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm_recon -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_glm -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_hb2hp -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_hb2hr -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_import -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_init -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_interpolate -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_jobman -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Gabriel GrΓ€ni -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_job_create -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_data -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_load_single_chan -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_merge -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_path -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_peakscore -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pp -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ppu2hb -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Samuel Gerster -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_predval -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_prepdata -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_process_illuminance -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pulse_convert -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pupil_correct_eyelink -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pupil_correct -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pupil_pp -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_pupil_pp_options -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_quit -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_ren -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_resp_pp -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_rev_con -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_rev_dcm -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_rev_glm -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_rev2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_review -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Gabriel Graeni -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_segment_mean -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_sf_auc -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_sf_dcm -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_sf_mp -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_sf_scl -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_sf_theta -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_sf -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_sf_get_theta -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_show_arms -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_spike_convert -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_split_sessions -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Linus RΓΌttimann -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_transfer_function -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_trim -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Dominik Bach -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_version -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -pspm_write_channel -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Tobias Moser -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -set_blinks_saccades_to_nan -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Eshref Yozdemir -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -x -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\end_body -\end_document From 574b6f8f54258ddd014b1976202a58e17c6ae1f4 Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Tue, 8 Oct 2019 08:09:00 +0200 Subject: [PATCH 14/55] Add jekyll and lyx ignore rules to gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 1fab4f581..43d172fdf 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ ImportTestData +.bundle/ +.jekyll-cache/ +Gemfile +Gemfile.lock +_site/ +vendor/ +*.lyx~ From 00c34ff7ce421741083f3d2ecf48e965e422ef1c Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 9 Oct 2019 20:15:02 +0200 Subject: [PATCH 15/55] First fixing tentative --- src/pspm_get_events.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pspm_get_events.m b/src/pspm_get_events.m index 06ed5139d..cb75f1f37 100644 --- a/src/pspm_get_events.m +++ b/src/pspm_get_events.m @@ -45,7 +45,7 @@ end % add more data in order to prevent deleting values with diff - data = [NaN; NaN; NaN; data; NaN; NaN; NaN;]; + data = [0; 0; 0; data; 0; 0; 0;]; % store information about finite and infinite in vector % used to reduce temp vector to relevant data finite = ~isnan(data); From 98502b4c12723427b57a1c351c3f9e6faaa220e2 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 9 Oct 2019 21:08:56 +0200 Subject: [PATCH 16/55] Fixed the problem with webread and try catch --- src/pspm_version.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pspm_version.m b/src/pspm_version.m index 68defa87b..86701de27 100644 --- a/src/pspm_version.m +++ b/src/pspm_version.m @@ -39,8 +39,8 @@ if nargin > 0 switch varargin{1} case 'check' % check for updates - [str, status] = urlread('http://pspm.sourceforge.net/'); - if status == 1 + try + str = webread('http://pspm.sourceforge.net/'); begidx = strfind(str, 'Current version'); endidx = begidx + strfind(str(begidx : end), sprintf('\n')); endidx = endidx(1); @@ -77,7 +77,7 @@ else warning('ID:invalid_input', 'Cannot figure out if there is a new version.'); return; end - else + catch warning('ID:invalid_input', 'Cannot check for updates.'); return end end From 735f57ba41fc46e6377d9f9fbee92385d17c52ce Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Thu, 10 Oct 2019 11:47:31 +0200 Subject: [PATCH 17/55] Fix #43 pspm_dcm now compares epoch durations specified with model.missing to subsession threshold specified in model.substhresh in order to decide whether to split a session into subsessions --- doc/PsPM_Manual.lyx | 2 +- src/pspm_cfg/pspm_cfg_dcm.m | 3 ++- src/pspm_dcm.m | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/PsPM_Manual.lyx b/doc/PsPM_Manual.lyx index 73b50611f..b4c182995 100644 --- a/doc/PsPM_Manual.lyx +++ b/doc/PsPM_Manual.lyx @@ -10818,7 +10818,7 @@ Missing epochs Indicate epochs in your data in which the signal is missing or corrupted (e.g., due to artifacts). Data around missing epochs are split into subsessions and are evaluated - independently. + independently if the missing epoch is at least as long as subsession threshold. NaN periods within the evaluated subsessions will be interpolated for averages and principal response components. \end_layout diff --git a/src/pspm_cfg/pspm_cfg_dcm.m b/src/pspm_cfg/pspm_cfg_dcm.m index b10d48a8f..7ba40ed9a 100644 --- a/src/pspm_cfg/pspm_cfg_dcm.m +++ b/src/pspm_cfg/pspm_cfg_dcm.m @@ -207,7 +207,8 @@ missing.help = {['Indicate epochs in your data in which the ', ... 'signal is missing or corrupted (e.g., due to artifacts). ', ... 'Data around missing epochs are split into subsessions and ', ... - 'are evaluated independently. NaN periods within the ', ... + 'are evaluated independently if the missing epoch is at least as long ', ... + 'as subsession threshold. NaN periods within the ', ... 'evaluated subsessions will be interpolated for averages ', ... 'and principal response components.'], ... ['Note: pspm_dcm calculates the inter-trial intervals as the ',... diff --git a/src/pspm_dcm.m b/src/pspm_dcm.m index 63a9414e8..618f2e595 100644 --- a/src/pspm_dcm.m +++ b/src/pspm_dcm.m @@ -36,7 +36,7 @@ % model.substhresh: minimum duration (in seconds) of NaN periods to % cause splitting up into subsessions which get % evaluated independently (excluding NaN values). -% default is 2. Will be ignored if model.missing is set. +% default is 2. % model.filter: filter settings; modality specific default % model.channel: channel number; default: first SCR channel % model.norm: normalise data; default 0 (i. e. data are normalised @@ -363,7 +363,7 @@ else % use missing epochs as specified by file miss_epochs = missing{iSn}*data{iSn}{1}.header.sr; - ignore_epochs = ones(size(miss_epochs,1),1); + ignore_epochs = diff(miss_epochs, 1, 2) / data{iSn}{1}.header.sr > model.substhresh; % disable offset for predefined missing epochs session_offset = 0; From e40e6b1f1815fa4cb2992882cbfd9f30abfef264 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 14 Oct 2019 11:42:46 +0200 Subject: [PATCH 18/55] Added 3 more checkpoints --- src/pspm_transfer_function.m | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pspm_transfer_function.m b/src/pspm_transfer_function.m index bb6a7ffd4..0bfcf45c8 100644 --- a/src/pspm_transfer_function.m +++ b/src/pspm_transfer_function.m @@ -39,9 +39,15 @@ % check input arguments if nargin<1 - errmsg='No data given.'; warning(errmsg); + errmsg='No data given.'; warning(errmsg); return; elseif nargin<2 - errmsg='No transfer constant given'; warning(errmsg); + errmsg='No transfer constant given.'; warning(errmsg); return; +elseif ~isnumeric(c) + warning('ID:invalid_input','The parameter ''c'' has to be numeric.'); return; +elseif ~isnumeric(Rs) + warning('ID:invalid_input','The parameter ''Rs'' has to be numeric.'); return; +elseif ~isnumeric(offset) + warning('ID:invalid_input','The parameter ''offset'' has to be numeric.'); return; elseif nargin<3 Rs=0; offset=0; elseif nargin<4 From ba5e5f7a0fb33849e70f4ddadd045454313f83b9 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 14 Oct 2019 11:49:49 +0200 Subject: [PATCH 19/55] Another small change --- src/pspm_transfer_function.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pspm_transfer_function.m b/src/pspm_transfer_function.m index 0bfcf45c8..0f710d6c3 100644 --- a/src/pspm_transfer_function.m +++ b/src/pspm_transfer_function.m @@ -39,9 +39,9 @@ % check input arguments if nargin<1 - errmsg='No data given.'; warning(errmsg); return; + warning('ID:invalid_input','No data given.'); return; elseif nargin<2 - errmsg='No transfer constant given.'; warning(errmsg); return; + warning('ID:invalid_input','No transfer constant given.'); return; elseif ~isnumeric(c) warning('ID:invalid_input','The parameter ''c'' has to be numeric.'); return; elseif ~isnumeric(Rs) From 312952388d407f386ef63f4cd8c7f1d6fbcd1c81 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 14 Oct 2019 12:19:27 +0200 Subject: [PATCH 20/55] Check existance --- src/pspm_transfer_function.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pspm_transfer_function.m b/src/pspm_transfer_function.m index 0f710d6c3..39f44d353 100644 --- a/src/pspm_transfer_function.m +++ b/src/pspm_transfer_function.m @@ -44,9 +44,9 @@ warning('ID:invalid_input','No transfer constant given.'); return; elseif ~isnumeric(c) warning('ID:invalid_input','The parameter ''c'' has to be numeric.'); return; -elseif ~isnumeric(Rs) +elseif exist('Rs','var') && ~isnumeric(Rs) warning('ID:invalid_input','The parameter ''Rs'' has to be numeric.'); return; -elseif ~isnumeric(offset) +elseif exist('offset','var') && ~isnumeric(offset) warning('ID:invalid_input','The parameter ''offset'' has to be numeric.'); return; elseif nargin<3 Rs=0; offset=0; From 15a5094dec9712dd5dccb9873e0cceaac3f6e21e Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 16 Oct 2019 13:22:53 +0200 Subject: [PATCH 21/55] Change the positions of the 'elseif' --- src/pspm_transfer_function.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pspm_transfer_function.m b/src/pspm_transfer_function.m index 39f44d353..bf192b8fa 100644 --- a/src/pspm_transfer_function.m +++ b/src/pspm_transfer_function.m @@ -44,14 +44,14 @@ warning('ID:invalid_input','No transfer constant given.'); return; elseif ~isnumeric(c) warning('ID:invalid_input','The parameter ''c'' has to be numeric.'); return; -elseif exist('Rs','var') && ~isnumeric(Rs) - warning('ID:invalid_input','The parameter ''Rs'' has to be numeric.'); return; -elseif exist('offset','var') && ~isnumeric(offset) - warning('ID:invalid_input','The parameter ''offset'' has to be numeric.'); return; elseif nargin<3 Rs=0; offset=0; +elseif ~isnumeric(Rs) + warning('ID:invalid_input','The parameter ''Rs'' has to be numeric.'); return; elseif nargin<4 offset=0; +elseif ~isnumeric(offset) + warning('ID:invalid_input','The parameter ''offset'' has to be numeric.'); return; elseif nargin < 5 recsys = 'conductance'; end; From 0b22bd09213dc7364a8067632eef891f8319dfe1 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 16 Oct 2019 16:12:53 +0200 Subject: [PATCH 22/55] Suppress all non markers form markers array --- src/Import/viewpoint/import_viewpoint.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Import/viewpoint/import_viewpoint.m b/src/Import/viewpoint/import_viewpoint.m index ac4fe7ed1..3d99ff745 100644 --- a/src/Import/viewpoint/import_viewpoint.m +++ b/src/Import/viewpoint/import_viewpoint.m @@ -49,6 +49,13 @@ [channels, marker, chan_info] = parse_messages(messages, channels, marker, chan_info, file_info.eyesObserved); sess_beg_indices = [find(contains(marker, '+')); size(dataraw, 1) + 1]; + + % After setting the beginning index we delete all ',','+','=' form markers array + NotMarkers = [',','+','=']; + for nmkr=1:size(NotMarkers,2) + marker = strrep(marker,NotMarkers(nmkr),''); + end + for sn = 1:numel(sess_beg_indices) - 1 begidx = sess_beg_indices(sn); endidx = sess_beg_indices(sn + 1) - 1; From 843a5b83cdec9814818cd815a5e525f43c2e93da Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 21 Oct 2019 09:14:15 +0200 Subject: [PATCH 23/55] Revert changes in import_v and add changes in get --- src/Import/viewpoint/import_viewpoint.m | 8 +------- src/pspm_get_viewpoint.m | 12 ++++++++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Import/viewpoint/import_viewpoint.m b/src/Import/viewpoint/import_viewpoint.m index 3d99ff745..a8a3dde7a 100644 --- a/src/Import/viewpoint/import_viewpoint.m +++ b/src/Import/viewpoint/import_viewpoint.m @@ -49,13 +49,7 @@ [channels, marker, chan_info] = parse_messages(messages, channels, marker, chan_info, file_info.eyesObserved); sess_beg_indices = [find(contains(marker, '+')); size(dataraw, 1) + 1]; - - % After setting the beginning index we delete all ',','+','=' form markers array - NotMarkers = [',','+','=']; - for nmkr=1:size(NotMarkers,2) - marker = strrep(marker,NotMarkers(nmkr),''); - end - + for sn = 1:numel(sess_beg_indices) - 1 begidx = sess_beg_indices(sn); endidx = sess_beg_indices(sn + 1) - 1; diff --git a/src/pspm_get_viewpoint.m b/src/pspm_get_viewpoint.m index e97fffb45..3483934b1 100644 --- a/src/pspm_get_viewpoint.m +++ b/src/pspm_get_viewpoint.m @@ -309,6 +309,18 @@ end function import_cell = import_marker_chan(import_cell, markers, mi_names, mi_values, n_rows, sampling_rate) + % Put here all characters which do not belong to markers + % they have to be separated by a '|' + % '=' has a special threatment because we do not want to delete 'CS+' + non_markers = [',','|','(? Date: Mon, 21 Oct 2019 10:54:48 +0200 Subject: [PATCH 24/55] Regex pattern modified --- src/pspm_get_viewpoint.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pspm_get_viewpoint.m b/src/pspm_get_viewpoint.m index 3483934b1..5c14859f6 100644 --- a/src/pspm_get_viewpoint.m +++ b/src/pspm_get_viewpoint.m @@ -312,14 +312,14 @@ % Put here all characters which do not belong to markers % they have to be separated by a '|' % '=' has a special threatment because we do not want to delete 'CS+' - non_markers = [',','|','(? Date: Mon, 21 Oct 2019 10:56:05 +0200 Subject: [PATCH 25/55] Comments modified --- src/pspm_get_viewpoint.m | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pspm_get_viewpoint.m b/src/pspm_get_viewpoint.m index 5c14859f6..149409c96 100644 --- a/src/pspm_get_viewpoint.m +++ b/src/pspm_get_viewpoint.m @@ -309,9 +309,8 @@ end function import_cell = import_marker_chan(import_cell, markers, mi_names, mi_values, n_rows, sampling_rate) - % Put here all characters which do not belong to markers - % they have to be separated by a '|' - % '=' has a special threatment because we do not want to delete 'CS+' + % Put here all characters which do not belong to markers. + % They have to be separated by a '|' non_markers = [',','|','+','|','=']; mi_names_tmp = regexprep(mi_names,non_markers,''); From 995ab85ddc5e58135506cfead629352578ea48ad Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 21 Oct 2019 12:20:18 +0200 Subject: [PATCH 26/55] Changes try/catch to if --- src/pspm_hb2hp.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pspm_hb2hp.m b/src/pspm_hb2hp.m index 6178f3e5f..a38ebbf40 100644 --- a/src/pspm_hb2hp.m +++ b/src/pspm_hb2hp.m @@ -35,10 +35,11 @@ global settings; if isempty(settings), pspm_init; end; -try option.channel_action; catch options.channel_action = 'replace'; end; -try options.limit; catch options.limit = struct(); end; -try options.limit.upper; catch options.limit.upper = 2; end; -try options.limit.lower; catch options.limit.lower = 0.2; end; +if ~exist('options','var'), options = struct(); end; +if ~isfield(options,'channel_action'), options.channel_action = 'replace'; end; +if ~isfield(options,'limit'), options.limit = struct(); end; +if ~isfield(options.limit,'upper'), options.limit.upper = 2; end; +if ~isfield(options.limit,'lower'), options.limit.lower = 0.2; end; % check input % ------------------------------------------------------------------------- From e1bae16b42f71ebbda5c604a96583edc2548f557 Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Tue, 22 Oct 2019 09:19:03 +0200 Subject: [PATCH 27/55] Fix concatenation error by transposing the cell array --- src/pspm_get_viewpoint.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pspm_get_viewpoint.m b/src/pspm_get_viewpoint.m index 149409c96..d02288387 100644 --- a/src/pspm_get_viewpoint.m +++ b/src/pspm_get_viewpoint.m @@ -217,7 +217,9 @@ function proper = assert_sessions_are_one_after_another(data) proper = true; - seconds_concat = cell2mat(cellfun(@(x) x.channels(:, 1), data, 'UniformOutput', false)); + cell_of_second_arrays = cellfun(@(x) x.channels(:, 1), data, 'UniformOutput', false); + cell_of_second_arrays = cell_of_second_arrays'; + seconds_concat = cell2mat(cell_of_second_arrays); neg_diff_indices = find(diff(seconds_concat) < 0); if ~isempty(neg_diff_indices) first_neg_idx = neg_diff_indices(1); From 89dc05b45eb7dbd53e7778d3468f36ac06931f35 Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Tue, 22 Oct 2019 09:19:56 +0200 Subject: [PATCH 28/55] Add NaNs between sessions if gap is big enough --- src/pspm_get_viewpoint.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pspm_get_viewpoint.m b/src/pspm_get_viewpoint.m index d02288387..fd4f6852b 100644 --- a/src/pspm_get_viewpoint.m +++ b/src/pspm_get_viewpoint.m @@ -408,8 +408,9 @@ start_time = data{c}.channels(1, second_col_idx); end_time = data{c}.channels(end, second_col_idx); - n_missing = round((start_time - last_time) * sr); - if n_missing > 0 + time_diff = start_time - last_time; + if time_diff > 1.5 * (1 / sr) + n_missing = round(time_diff * sr); curr_len = size(data_concat, 1); data_concat(end + 1:(end + n_missing), 1:n_cols) = NaN(n_missing, n_cols); end From 093f6e0745e657d0cda2977995004bd41590fb90 Mon Sep 17 00:00:00 2001 From: Esref Ozdemir Date: Tue, 22 Oct 2019 09:24:51 +0200 Subject: [PATCH 29/55] Check if a marker only contains one of +,= for splitting --- src/Import/viewpoint/import_viewpoint.m | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Import/viewpoint/import_viewpoint.m b/src/Import/viewpoint/import_viewpoint.m index a8a3dde7a..daadec1c6 100644 --- a/src/Import/viewpoint/import_viewpoint.m +++ b/src/Import/viewpoint/import_viewpoint.m @@ -48,7 +48,17 @@ channels = dataraw(:, chan_info.col_idx); [channels, marker, chan_info] = parse_messages(messages, channels, marker, chan_info, file_info.eyesObserved); - sess_beg_indices = [find(contains(marker, '+')); size(dataraw, 1) + 1]; + sess_beg_indices = []; + marker_indices = find(cellfun(@(x) ~isempty(x), marker)); + for i = 1:numel(marker_indices) + idx = marker_indices(i); + marker_str = marker{idx}; + char_eq = (marker_str == '+') + (marker_str == '=') + (marker_str == ','); + if sum(char_eq) == numel(marker_str) + sess_beg_indices(end + 1) = idx; + end + end + sess_beg_indices(end + 1) = size(dataraw, 1) + 1; for sn = 1:numel(sess_beg_indices) - 1 begidx = sess_beg_indices(sn); From 11a90bd9441cacb7e6adcd181d9d2ba6a66f0dac Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 23 Oct 2019 15:13:16 +0200 Subject: [PATCH 30/55] Add changes to hb2hp file and created a test --- src/pspm_hb2hp.m | 15 +++++++------ test/pspm_hb2hp_test.m | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 test/pspm_hb2hp_test.m diff --git a/src/pspm_hb2hp.m b/src/pspm_hb2hp.m index a38ebbf40..687e04f40 100644 --- a/src/pspm_hb2hp.m +++ b/src/pspm_hb2hp.m @@ -44,17 +44,17 @@ % check input % ------------------------------------------------------------------------- if nargin < 1 - warning('No input. Don''t know what to do.'); return; + warning('ID:invalid_input','No input. Don''t know what to do.'); return; elseif ~ischar(fn) - warning('Need file name string as first input.'); return; + warning('ID:invalid_input','Need file name string as first input.'); return; elseif nargin < 2 - warning('No sample rate given.'); return; + warning('ID:invalid_input','No sample rate given.'); return; elseif ~isnumeric(sr) - warning('Sample rate needs to be numeric.'); return; + warning('ID:invalid_input','Sample rate needs to be numeric.'); return; elseif nargin < 3 || isempty(chan) || (isnumeric(chan) && (chan == 0)) chan = 'hb'; elseif ~isnumeric(chan) && ~strcmpi(chan, 'hb') - warning('Channel number must be numeric'); return; + warning('ID:invalid_input','Channel number must be numeric'); return; end; % get data @@ -93,8 +93,9 @@ newdata.header.chantype = 'hp'; o.msg.prefix = 'Heart beat converted to heart period and'; -[sts, winfos] = pspm_write_channel(fn, newdata, options.channel_action, o); -if nsts == -1 +try + [~,winfos] = pspm_write_channel(fn, newdata, options.channel_action, o); +catch warning('ID:invalid_input', 'call of pspm_write_channel failed'); return; end; diff --git a/test/pspm_hb2hp_test.m b/test/pspm_hb2hp_test.m new file mode 100644 index 000000000..0f6624f7b --- /dev/null +++ b/test/pspm_hb2hp_test.m @@ -0,0 +1,49 @@ +classdef pspm_hb2hp_test < matlab.unittest.TestCase +% unittest class for the pspm_hb2hp function +%__________________________________________________________________________ +% PsPM TestEnvironment +% (C) 2019 Ivan Rojkov (University of Zurich) + + + methods (Test) + + function invalid_input(this) + + files = {... + fullfile('ImportTestData', 'ecg2hb', 'test_ecg_outlier_data_short.mat'),... + fullfile('ImportTestData', 'ecg2hb', 'test_hb2hp_data1.mat'),... + fullfile('ImportTestData', 'ecg2hb', 'test_hb2hp_data2.mat')... + }; + + options.channel_action = 'abc'; + + % Verify no input + this.verifyWarning(@() pspm_hb2hp(), 'ID:invalid_input'); + + % Verify not a string filename + this.verifyWarning(@() pspm_hb2hp(2), 'ID:invalid_input'); + + % Verify no sample rate + this.verifyWarning(@() pspm_hb2hp('abc'), 'ID:invalid_input'); + + % Verify not a string sample rate + this.verifyWarning(@() pspm_hb2hp('abc','abc'), 'ID:invalid_input'); + + % Verify not a numeric channel + this.verifyWarning(@() pspm_hb2hp('abc',2,'abc'), 'ID:invalid_input'); + + % Verify that call of pspm_load_data fails + this.verifyWarning(@() pspm_hb2hp(files{1},100), 'ID:invalid_input'); + + % Verify that interpolation does not have enough points + this.verifyWarning(@() pspm_hb2hp(files{2}, 100), 'ID:too_strict_limits'); + + % Verify that call of pspm_write_channel fails + this.verifyWarning(@() pspm_hb2hp(files{3},100,[],options), 'ID:invalid_input'); + + end + + end + +end + From 55560f6fdafbd0d973b9bb92c19d97a9115f672d Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 23 Oct 2019 17:57:45 +0200 Subject: [PATCH 31/55] Corrected a typo and the error to usual notation --- src/pspm_filtfilt.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pspm_filtfilt.m b/src/pspm_filtfilt.m index 801e32e28..0affc7f2b 100644 --- a/src/pspm_filtfilt.m +++ b/src/pspm_filtfilt.m @@ -51,7 +51,7 @@ if n>1 && m>1 y = zeros(size(x)); for i=1:n - y(:,i) = spm_filtfilt(b,a,x(:,i)); + y(:,i) = pspm_filtfilt(b,a,x(:,i)); end return end @@ -68,7 +68,7 @@ nfact = 3*(nfilt-1); if len <= nfact - error('Data must have length more than 3 times filter order.'); + warning('ID:invalid_input','Data must have length more than 3 times filter order.'); return; end % Use sparse matrix to solve system of linear equations for initial From e1231132d5e2de1d7a31a8b31b25515633b91df0 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Sun, 27 Oct 2019 22:51:03 +0100 Subject: [PATCH 32/55] Added one test condition --- src/pspm_filtfilt.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pspm_filtfilt.m b/src/pspm_filtfilt.m index 0affc7f2b..f62bd95c5 100644 --- a/src/pspm_filtfilt.m +++ b/src/pspm_filtfilt.m @@ -47,6 +47,11 @@ % Check input data %-------------------------------------------------------------------------- + +if nargin < 3 + warning('ID:invalid_input','Not enough parameters were specified.'); return; +end + [m,n] = size(x); if n>1 && m>1 y = zeros(size(x)); From d05187b108e795ee917a6cbe8ad2aeaf1173a527 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Sun, 27 Oct 2019 22:58:52 +0100 Subject: [PATCH 33/55] Added a last assertion --- src/pspm_hb2hp.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pspm_hb2hp.m b/src/pspm_hb2hp.m index 687e04f40..23ff2cc6a 100644 --- a/src/pspm_hb2hp.m +++ b/src/pspm_hb2hp.m @@ -94,7 +94,8 @@ o.msg.prefix = 'Heart beat converted to heart period and'; try - [~,winfos] = pspm_write_channel(fn, newdata, options.channel_action, o); + [nsts,winfos] = pspm_write_channel(fn, newdata, options.channel_action, o); + if nsts == -1, return; end catch warning('ID:invalid_input', 'call of pspm_write_channel failed'); return; From eeeeed443c19e7d588e39a4bb9c68558b32c27ba Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 28 Oct 2019 10:08:26 +0100 Subject: [PATCH 34/55] Modified data and finite --- src/pspm_get_events.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/pspm_get_events.m b/src/pspm_get_events.m index cb75f1f37..564a2e5ad 100644 --- a/src/pspm_get_events.m +++ b/src/pspm_get_events.m @@ -45,10 +45,17 @@ end % add more data in order to prevent deleting values with diff - data = [0; 0; 0; data; 0; 0; 0;]; + head = NaN; + if data(1)~=0 + head = -round(1000*rand(1)); + while ismember(head_tail,data) + head = -round(1000*rand(1)); + end + end + data = [NaN; head; head; data; 0; NaN; NaN;]; % store information about finite and infinite in vector % used to reduce temp vector to relevant data - finite = ~isnan(data); + finite = (data~=head)&(~isnan(data)); % initialize temp array and transpose to have a vertical vector temp = (1:numel(data)).'; From 63fae0142e2ee284fac1ee486cff4bc8e6365fed Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 28 Oct 2019 10:12:31 +0100 Subject: [PATCH 35/55] Typo --- src/pspm_get_events.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pspm_get_events.m b/src/pspm_get_events.m index 564a2e5ad..8b4d8548e 100644 --- a/src/pspm_get_events.m +++ b/src/pspm_get_events.m @@ -48,7 +48,7 @@ head = NaN; if data(1)~=0 head = -round(1000*rand(1)); - while ismember(head_tail,data) + while ismember(head,data) head = -round(1000*rand(1)); end end From 5eea10eb8147f98546de867b061454a280d2772e Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 28 Oct 2019 11:43:05 +0100 Subject: [PATCH 36/55] Modified data and finite --- src/pspm_get_events.m | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/pspm_get_events.m b/src/pspm_get_events.m index 8b4d8548e..612a8f5d9 100644 --- a/src/pspm_get_events.m +++ b/src/pspm_get_events.m @@ -45,17 +45,10 @@ end % add more data in order to prevent deleting values with diff - head = NaN; - if data(1)~=0 - head = -round(1000*rand(1)); - while ismember(head,data) - head = -round(1000*rand(1)); - end - end - data = [NaN; head; head; data; 0; NaN; NaN;]; + data = [NaN; 0; 0; data; 0; 0; NaN;]; % store information about finite and infinite in vector % used to reduce temp vector to relevant data - finite = (data~=head)&(~isnan(data)); + finite = ~isnan(data); % initialize temp array and transpose to have a vertical vector temp = (1:numel(data)).'; From c625a64ec4f54d0d7d2cb9525f1f79759408691d Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 28 Oct 2019 11:49:09 +0100 Subject: [PATCH 37/55] Typo --- src/pspm_get_events.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pspm_get_events.m b/src/pspm_get_events.m index 612a8f5d9..8000bfb15 100644 --- a/src/pspm_get_events.m +++ b/src/pspm_get_events.m @@ -45,7 +45,7 @@ end % add more data in order to prevent deleting values with diff - data = [NaN; 0; 0; data; 0; 0; NaN;]; + data = [0; 0; 0; data; 0; 0; NaN;]; % store information about finite and infinite in vector % used to reduce temp vector to relevant data finite = ~isnan(data); From 08d5bd40c8cd25fc71a76aa55891855f8ec2cd1a Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 28 Oct 2019 11:57:38 +0100 Subject: [PATCH 38/55] Created a warning --- src/pspm_filtfilt.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pspm_filtfilt.m b/src/pspm_filtfilt.m index 801e32e28..80b191c44 100644 --- a/src/pspm_filtfilt.m +++ b/src/pspm_filtfilt.m @@ -70,6 +70,9 @@ if len <= nfact error('Data must have length more than 3 times filter order.'); end +if na == 1 + warning('ID:invalid_input','The filter parameters ''a'' must be of dimension 2.'); return; +end % Use sparse matrix to solve system of linear equations for initial % conditions zi are the steady-state states of the filter b(z)/a(z) in the From bf7857e736e1960a856416c1b3b9f453f17244ce Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 28 Oct 2019 12:10:29 +0100 Subject: [PATCH 39/55] Created a test for pspm_filtfilt --- test/pspm_filtfilt_test.m | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test/pspm_filtfilt_test.m diff --git a/test/pspm_filtfilt_test.m b/test/pspm_filtfilt_test.m new file mode 100644 index 000000000..0fcc6caba --- /dev/null +++ b/test/pspm_filtfilt_test.m @@ -0,0 +1,26 @@ +classdef pspm_filtfilt_test < matlab.unittest.TestCase +% unittest class for the pspm_hb2hp function +%__________________________________________________________________________ +% PsPM TestEnvironment +% (C) 2019 Ivan Rojkov (University of Zurich) + + + methods (Test) + + function invalid_input(this) + + % Verify no input + this.verifyWarning(@() pspm_filtfilt(), 'ID:invalid_input'); + + % Verify that 'a' isn't of dimension 1 + this.verifyWarning(@() pspm_filtfilt(1,1,[1:10]), 'ID:invalid_input'); + + % Verify that data must have length more than 3 times filter order. + this.verifyWarning(@() pspm_filtfilt([1:10],[1:20],[1:10]), 'ID:invalid_input'); + + end + + end + +end + From 21e5fe991c56d2dbe6dda3c5d271aa145f5430e1 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 28 Oct 2019 14:38:10 +0100 Subject: [PATCH 40/55] Created a test for pspm_butter.m --- src/pspm_butter.m | 145 ++++++++++++++++++++-------------------- test/pspm_butter_test.m | 33 +++++++++ 2 files changed, 106 insertions(+), 72 deletions(-) create mode 100644 test/pspm_butter_test.m diff --git a/src/pspm_butter.m b/src/pspm_butter.m index d68b2bb3c..a3472ff6f 100644 --- a/src/pspm_butter.m +++ b/src/pspm_butter.m @@ -1,79 +1,80 @@ function [sts, b, a] = pspm_butter(order, freqratio, pass) -% This function interfaces Matlab Signal Processing Toolbox filters and -% additionally implements a few standard filters for those who don''t have -% this toolbox -% FORMAT [sts, b, a] = pspm_butter(order, freqratio) -% returns sts = -1 if non-standard filters are requested -% -%__________________________________________________________________________ -% PsPM 3.0 -% (c) 2009-2015 Dominik R Bach (Wellcome Trust Centre for Neuroimaging) - -% $Id$ -% $Rev$ - -% initialise -% ------------------------------------------------------------------------ -global settings; -if isempty(settings), pspm_init; end; -sts = -1; a = []; b = []; -errmsg = ' - please install the signal processing toolbox if you need other filters.'; - -% check input arguments -% ------------------------------------------------------------------------ -if nargin < 2 - warning('Not enough input arguments.'); return; -elseif nargin < 3 - pass = 'low'; -elseif ~(any(strcmpi(pass, {'high', 'low'}))) - warning('%s is not a valid argument.', pass); return; -end; + % This function interfaces Matlab Signal Processing Toolbox filters and + % additionally implements a few standard filters for those who don''t have + % this toolbox + % FORMAT [sts, b, a] = pspm_butter(order, freqratio) + % returns sts = -1 if non-standard filters are requested + % + %__________________________________________________________________________ + % PsPM 3.0 + % (c) 2009-2015 Dominik R Bach (Wellcome Trust Centre for Neuroimaging) -if ~settings.signal && order ~= 1 - warning('This function can only create 1st order filters - %s', errmsg); return; -end; - -% filters -% ------------------------------------------------------------------------ -if settings.signal - [b, a]=butter(order, freqratio, pass); -else - load('pspm_butter.mat'); - switch pass - case 'low' - f = filt{1}; - case 'high' - f = filt{2}; + % $Id$ + % $Rev$ + + % initialise + % ------------------------------------------------------------------------ + global settings; + if isempty(settings), pspm_init; end; + sts = -1; a = []; b = []; + errmsg = ' - please install the signal processing toolbox if you need other filters.'; + + % check input arguments + % ------------------------------------------------------------------------ + if nargin < 2 + warning('ID:invalid_input','Not enough input arguments.'); return; + elseif nargin < 3 + pass = 'low'; + elseif ~(any(strcmpi(pass, {'high', 'low'}))) + warning('ID:invalid_input','%s is not a valid argument.', pass); return; + end; + + if ~settings.signal && order ~= 1 + warning('ID:toolbox_missing','This function can only create 1st order filters - %s', errmsg); return; end; - d = abs([f.freqratio] - freqratio); - n = find(d < .0001); - if isempty(n) - warning('No filter implemented for this frequency ratio %s', errmsg); return; + + % filters + % ------------------------------------------------------------------------ + if settings.signal + [b, a]=butter(order, freqratio, pass); else - if numel(n) > 1 - [foo, n] = min(d); + load('pspm_butter.mat'); + switch pass + case 'low' + f = filt{1}; + case 'high' + f = filt{2}; + end; + d = abs([f.freqratio] - freqratio); + n = find(d < .0001); + if isempty(n) + warning('ID:toolbox_missing','No filter implemented for this frequency ratio %s', errmsg); return; + else + if numel(n) > 1 + [foo, n] = min(d); + end; + a = f(n).a; + b = f(n).b; end; - a = f(n).a; - b = f(n).b; end; -end; - -sts = 1; -return; -% create filters (last used on 29.09.2013) -% ------------------------------------------------------------------------ -% % lowpass -% freqratio = [4.95/5 1./([2:4 5:5:500])]; -% for n = 1:numel(freqratio) -% [filt{1}(n).b filt{1}(n).a] = butter(1, freqratio(n)); -% filt{1}(n).freqratio = freqratio(n); -% end; -% % highpass (standard filter DCM, standard filter GLM) -% freqratio = [0.0159./([4.5 5:5:500]), 0.05./([4.5 5:5:500])]; -% for n = 1:numel(freqratio) -% [filt{2}(n).b filt{2}(n).a] = butter(1, freqratio(n), 'high'); -% filt{2}(n).freqratio = freqratio(n); -% end; -% save([settings.path, 'pspm_butter.mat'], 'filt'); - + sts = 1; + return; + + % create filters (last used on 29.09.2013) + % ------------------------------------------------------------------------ + % % lowpass + % freqratio = [4.95/5 1./([2:4 5:5:500])]; + % for n = 1:numel(freqratio) + % [filt{1}(n).b filt{1}(n).a] = butter(1, freqratio(n)); + % filt{1}(n).freqratio = freqratio(n); + % end; + % % highpass (standard filter DCM, standard filter GLM) + % freqratio = [0.0159./([4.5 5:5:500]), 0.05./([4.5 5:5:500])]; + % for n = 1:numel(freqratio) + % [filt{2}(n).b filt{2}(n).a] = butter(1, freqratio(n), 'high'); + % filt{2}(n).freqratio = freqratio(n); + % end; + % save([settings.path, 'pspm_butter.mat'], 'filt'); + + \ No newline at end of file diff --git a/test/pspm_butter_test.m b/test/pspm_butter_test.m new file mode 100644 index 000000000..a9425d8af --- /dev/null +++ b/test/pspm_butter_test.m @@ -0,0 +1,33 @@ +classdef pspm_butter_test < matlab.unittest.TestCase +% unittest class for the pspm_hb2hp function +%__________________________________________________________________________ +% PsPM TestEnvironment +% (C) 2019 Ivan Rojkov (University of Zurich) + + + methods (Test) + + function invalid_input(this) + + global settings; + if isempty(settings), pspm_init; end; + + settings.signal = 0; + + % Verify not enough input + this.verifyWarning(@() pspm_butter(), 'ID:invalid_input'); + + % Verify that pass is either 'high' or 'low' + this.verifyWarning(@() pspm_butter(1,1,'abc'), 'ID:invalid_input'); + + % Verify that Signal processing toolbox is missing #1 + this.verifyWarning(@() pspm_butter(2,1), 'ID:toolbox_missing'); + + % Verify that Signal processing toolbox is missing #2 + this.verifyWarning(@() pspm_butter(1,1), 'ID:toolbox_missing'); + end + + end + +end + From cc29801c7f1287ab559d5d31e56c7ec30ba438e1 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 30 Oct 2019 14:23:36 +0100 Subject: [PATCH 41/55] Changed na to nfilt --- src/pspm_filtfilt.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pspm_filtfilt.m b/src/pspm_filtfilt.m index 80b191c44..eea432979 100644 --- a/src/pspm_filtfilt.m +++ b/src/pspm_filtfilt.m @@ -70,8 +70,8 @@ if len <= nfact error('Data must have length more than 3 times filter order.'); end -if na == 1 - warning('ID:invalid_input','The filter parameters ''a'' must be of dimension 2.'); return; +if nfilt == 1 + y=x; return end % Use sparse matrix to solve system of linear equations for initial From 1f1a0b2f76c0751f60a8feb99be85a23aa06c0a5 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 30 Oct 2019 14:32:30 +0100 Subject: [PATCH 42/55] Changed the test file in concequence --- test/pspm_filtfilt_test.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/pspm_filtfilt_test.m b/test/pspm_filtfilt_test.m index 0fcc6caba..3d0b92a59 100644 --- a/test/pspm_filtfilt_test.m +++ b/test/pspm_filtfilt_test.m @@ -12,9 +12,6 @@ function invalid_input(this) % Verify no input this.verifyWarning(@() pspm_filtfilt(), 'ID:invalid_input'); - % Verify that 'a' isn't of dimension 1 - this.verifyWarning(@() pspm_filtfilt(1,1,[1:10]), 'ID:invalid_input'); - % Verify that data must have length more than 3 times filter order. this.verifyWarning(@() pspm_filtfilt([1:10],[1:20],[1:10]), 'ID:invalid_input'); From 46971dad9d88bb1d535b9512db6fd493cfbe03d8 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 30 Oct 2019 15:41:58 +0100 Subject: [PATCH 43/55] Updated version number --- doc/PsPM_Developers_Guide.lyx | 2 +- doc/PsPM_Manual.lyx | 2 +- doc/PsPM_release_checklist.md | 8 ++++---- src/pspm_msg.txt | 2 +- src/pspm_quit.m | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/PsPM_Developers_Guide.lyx b/doc/PsPM_Developers_Guide.lyx index 17d89e7dd..7031968b9 100644 --- a/doc/PsPM_Developers_Guide.lyx +++ b/doc/PsPM_Developers_Guide.lyx @@ -98,7 +98,7 @@ Developer's Guide \begin_layout Standard \align center -Version 4.2.0 +Version 4.2.1 \end_layout \begin_layout Standard diff --git a/doc/PsPM_Manual.lyx b/doc/PsPM_Manual.lyx index b4c182995..adf7b6758 100644 --- a/doc/PsPM_Manual.lyx +++ b/doc/PsPM_Manual.lyx @@ -103,7 +103,7 @@ PsPM: Psychophysiological Modelling \begin_layout Standard \align center -Version 4.2.0 +Version 4.2.1 \end_layout \begin_layout Standard diff --git a/doc/PsPM_release_checklist.md b/doc/PsPM_release_checklist.md index 5520506ec..f308e6367 100644 --- a/doc/PsPM_release_checklist.md +++ b/doc/PsPM_release_checklist.md @@ -5,11 +5,11 @@ any revisions (commits) that implement/fix something new in the release branch, don't merge these branches back to trunk. Therefore, it is sensible to create the release branch after making absolutely sure that no new stuff will be implemented. -- [ ] Update version number & date in - - [ ] `pspm_msg` - - [ ] `pspm_quit` +- [x] Update version number & date in + - [x] `pspm_msg` + - [x] `pspm_quit` - [ ] `pspm.fig`: Load `pspm.fig` into MATLAB, update `fig.Children(9).String` and save back to `pspm.fig` - - [ ] Manual and Developers Guide: front pages + - [x] Manual and Developers Guide: front pages - [ ] Make sure both manuals are updated - [ ] Add release notes section of the new version to manual (at the end) - [ ] Get the manual reviewed diff --git a/src/pspm_msg.txt b/src/pspm_msg.txt index 3c07d5fc5..623e22a15 100644 --- a/src/pspm_msg.txt +++ b/src/pspm_msg.txt @@ -1,7 +1,7 @@ $___________________________________________________________________________ Welcome to PsPM - PsychoPhysiological Modelling (incorporating SCRalyze) -Version 4.2.0 (17.06.2019) +Version 4.2.1 (17.06.2019) $ ------------------------------------------ (c) 2008-2019 diff --git a/src/pspm_quit.m b/src/pspm_quit.m index 5621f6a82..2caeb02e0 100644 --- a/src/pspm_quit.m +++ b/src/pspm_quit.m @@ -1,6 +1,6 @@ % pspm_quit clears settings, removes paths & closes figures %__________________________________________________________________________ -% PsPM 4.2.0 +% PsPM 4.2.1 % (C) 2008-2019 Dominik R Bach (Wellcome Trust Centre for Neuroimaging) % % $Id: pspm_quit.m 805 2019-09-16 07:12:08Z esrefo $ From e86b7a6cd02469c913110c54c9bba1d710d9c935 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 30 Oct 2019 16:46:34 +0100 Subject: [PATCH 44/55] Updated Manuals --- doc/PsPM_Developers_Guide.lyx | 516 +++++++++++++++++++++++++++++++++- doc/PsPM_release_checklist.md | 2 +- 2 files changed, 511 insertions(+), 7 deletions(-) diff --git a/doc/PsPM_Developers_Guide.lyx b/doc/PsPM_Developers_Guide.lyx index 7031968b9..0748eb490 100644 --- a/doc/PsPM_Developers_Guide.lyx +++ b/doc/PsPM_Developers_Guide.lyx @@ -6136,6 +6136,161 @@ Description: In each of these cases check if the returned channels have the same duration that is equal to the maximum duration of all input channels. \end_layout +\begin_layout Subsection +Testcases: pspm_butter +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_butter_test +\begin_inset Newline newline +\end_inset + +Function: [sts, b, a] = pspm_butter(order, freqratio, pass) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid and + if the Signal processing toolbox is installed. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_butter() [no input] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_butter(1,1,'abc') [pass not equal to 'high' or 'low'] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_butter(2,1) ['Signal processing toolbox is missing' #1] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:toolbox_missing +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_butter(1,1) ['Signal processing toolbox is missing' #2] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:toolbox_missing +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + \begin_layout Subsection Testcases: pspm_bf_test \end_layout @@ -7207,6 +7362,121 @@ Time between end of recording and last data point \end_inset +\end_layout + +\begin_layout Subsection +Testcases: pspm_filtfilt +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_filtfilt_test +\begin_inset Newline newline +\end_inset + +Function: y = pspm_filtfilt(b,a,x) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_filtfilt() [no input] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_filtfilt([1:10],[1:20],[1:10]) [data length less than 3 times filter + order] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + \end_layout \begin_layout Subsection @@ -12642,6 +12912,240 @@ glm vector stats_exclude contains the expected condistion which should be excluded \end_layout +\begin_layout Subsection +Testcases: pspm_hb2hp +\end_layout + +\begin_layout Subsubsection +Information +\end_layout + +\begin_layout Standard +Testclass: pspm_hb2hp_test +\begin_inset Newline newline +\end_inset + +Function: [sts, infos] = pspm_hb2hp(fn, sr, chan, options) +\end_layout + +\begin_layout Subsubsection +Testcases +\end_layout + +\begin_layout Subsubsection* +Invalid input +\end_layout + +\begin_layout Standard +Function name: invalid_input(this) +\begin_inset Newline newline +\end_inset + +Description: Checks for warnings, if the input arguments are invalid. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Tests: +\end_layout + +\begin_layout Standard +\begin_inset Tabular + + + + + + +\begin_inset Text + +\begin_layout Plain Layout +Input +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Expected warning +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hp() [no input] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hp(2) [not a string filename] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hp('abc') [no sample rate] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hp('abc','abc') [not a string sample rate] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hp('abc',2,'abc') [not a numeric chanel] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hp(files{1},100) [call of pspm_load_data fails] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hp(files{2}, 100) [not enough points for interp1] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:too_strict_limits +\end_layout + +\end_inset + + + + +\begin_inset Text + +\begin_layout Plain Layout +pspm_hb2hp(files{3},100,[],options) [pspm_write_channel fails] +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +ID:invalid_input +\end_layout + +\end_inset + + + + +\end_inset + + +\end_layout + \begin_layout Subsection Testcases: pspm_import \end_layout @@ -21110,7 +21614,7 @@ Dominik Bach \begin_inset Text \begin_layout Plain Layout -- +X \end_layout \end_inset @@ -21119,7 +21623,7 @@ Dominik Bach \begin_inset Text \begin_layout Plain Layout -- +X \end_layout \end_inset @@ -22060,7 +22564,7 @@ Dominik Bach \begin_inset Text \begin_layout Plain Layout -- +x \end_layout \end_inset @@ -22069,7 +22573,7 @@ Dominik Bach \begin_inset Text \begin_layout Plain Layout -- +x \end_layout \end_inset @@ -24150,7 +24654,7 @@ Dominik Bach \begin_inset Text \begin_layout Plain Layout -- +x \end_layout \end_inset @@ -24159,7 +24663,7 @@ Dominik Bach \begin_inset Text \begin_layout Plain Layout -- +x \end_layout \end_inset diff --git a/doc/PsPM_release_checklist.md b/doc/PsPM_release_checklist.md index f308e6367..6470bcd0d 100644 --- a/doc/PsPM_release_checklist.md +++ b/doc/PsPM_release_checklist.md @@ -10,7 +10,7 @@ release branch after making absolutely sure that no new stuff will be implemente - [x] `pspm_quit` - [ ] `pspm.fig`: Load `pspm.fig` into MATLAB, update `fig.Children(9).String` and save back to `pspm.fig` - [x] Manual and Developers Guide: front pages -- [ ] Make sure both manuals are updated +- [x] Make sure both manuals are updated - [ ] Add release notes section of the new version to manual (at the end) - [ ] Get the manual reviewed - [ ] Create manual and dev guide PDFs using `lyx` From 759c263bd36dec5cd1d63ece978cb63963db7401 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Wed, 30 Oct 2019 17:39:52 +0100 Subject: [PATCH 45/55] Added release notes section --- doc/PsPM_Manual.lyx | 128 +++++++++++++++++++--------------- doc/PsPM_release_checklist.md | 2 +- 2 files changed, 71 insertions(+), 59 deletions(-) diff --git a/doc/PsPM_Manual.lyx b/doc/PsPM_Manual.lyx index adf7b6758..605e7959d 100644 --- a/doc/PsPM_Manual.lyx +++ b/doc/PsPM_Manual.lyx @@ -18583,7 +18583,7 @@ pspm_get_viewpoint \end_layout \begin_layout Section -PsPM Version 4.2.0 +PsPM Version 4.2.1 \end_layout \begin_layout Subsection* @@ -18591,60 +18591,37 @@ New Functions \end_layout \begin_layout Itemize -A new pupil data preprocessing function -\end_layout - -\begin_layout Itemize -A new pupil foreshortening error correction function -\end_layout - -\begin_layout Itemize -A new QRS detection algorithm for fMRI environments +Three new tests (pspm_hb2hp_test.m, pspm_filtfilt_test.m, pspm_butter_test.m) \end_layout \begin_layout Subsection* New Features \end_layout -\begin_layout Itemize -Previously, Eyelink import used to discard 50 ms worth of samples from each - side of every blink or saccade period. - This behaviour is preserved; however, sample discard duration can now be - set by the user. -\end_layout - -\begin_layout Itemize -Channel processing functions now store extensive historical data in PsPM - files. - This data can be printed in table format using the new utility -\family typewriter -function pspm_format_history_from_file -\end_layout - -\begin_layout Itemize -Pupil channel is now loaded according to a new precedence order. - Refer to GLM documentation in this manual to learn more. -\end_layout - \begin_layout Subsection* Changes \end_layout \begin_layout Itemize -Eyelink import now returns times and dates in a slightly different format. -\end_layout -\begin_layout Itemize -Newest version of PsPM is now obtained from the version string in pspm.sourceforg -e.net, not from the download link zip file name +\family typewriter +pspm_display +\family default + and +\family typewriter +pspm_ecg_editor +\family default + do not perform filtering anymore. \end_layout \begin_layout Itemize -GLM now uses the -\series bold -LAST -\series default - channel of a specified modality in a PsPM file. +When +\family typewriter + pspm_dcm +\family default + is run on an experiment with 40 trials, 20 of which are reinforced CS+ + trials, it now analyzes all input trials and do not split sessions into + many subsessions. \end_layout \begin_layout Itemize @@ -18670,50 +18647,85 @@ Bugfixes \begin_layout Itemize Fix a bug in \family typewriter -pspm_extract_segments +pspm_hb2hp \family default - where trial onsets were not assigned to conditions correctly + where the function crashed when there is no heartbeat left after lower + and upper bound filtering of the heartbeat periods \end_layout \begin_layout Itemize -Fix a bug in Viewpoint import where files in DOS format were being parsed - incorrectly +Fix a bug in +\family typewriter +import_eyelink +\family default + which imported more markers than the number of markers in the actual .asc + file \end_layout \begin_layout Itemize -Fix a bug in Eyelink import where blink/saccade periods where misaligned, - causing the function to discard useful data and return noise instead +Fix a bug in +\family typewriter +pspm_display +\family default + which crashed when trying to plot ECG signal that contains NaN \end_layout -\begin_layout Subsection* -Improvements +\begin_layout Itemize +Fix a bug in +\family typewriter +pspm_prepdata +\family default + which returned only NaN when input signal contained some NaN values \end_layout \begin_layout Itemize -New utility functions to make PsPM more compatible across different operating - systems +Fix a bug in +\family typewriter +pspm_version +\family default + which crashed when MATLAB was invoked with +\family typewriter +-nojvm \end_layout \begin_layout Itemize -An optimized Eyelink import function that is significantly faster and more - memory efficient than previous versions +Fix a bug in +\family typewriter +pspm_get_viewpoint +\family default + which returned '+,=,+' lines in the marker list and which crashed when + given a viewpoint data file containing multiple sessions separated with + '+,=' type of markers \end_layout \begin_layout Itemize -An optimized SMI event import function that is significantly faster than - the previous version +Fix a bug in +\family typewriter +import_viewpoint +\family default + which created a new session for every marker containing a '+' somewhere, + e.g.: 'CS+' \end_layout \begin_layout Itemize -Multiple new tests to validate the correctness of the functions +Fix a bug in +\family typewriter +pspm_get_events +\family default + which was not able to locate a marker if it occured on the first or last + sample in a given datafile \end_layout \begin_layout Itemize -API unification: Now all preprocessing functions use +Fix a bug in \family typewriter -channel_action +pspm_filtfilt \family default - variable to choose what to do with the new channel. + which crashed when the filter parameters were of dimension one +\end_layout + +\begin_layout Subsection* +Improvements \end_layout \begin_layout Part diff --git a/doc/PsPM_release_checklist.md b/doc/PsPM_release_checklist.md index 6470bcd0d..2ab216039 100644 --- a/doc/PsPM_release_checklist.md +++ b/doc/PsPM_release_checklist.md @@ -11,7 +11,7 @@ release branch after making absolutely sure that no new stuff will be implemente - [ ] `pspm.fig`: Load `pspm.fig` into MATLAB, update `fig.Children(9).String` and save back to `pspm.fig` - [x] Manual and Developers Guide: front pages - [x] Make sure both manuals are updated -- [ ] Add release notes section of the new version to manual (at the end) +- [x] Add release notes section of the new version to manual (at the end) - [ ] Get the manual reviewed - [ ] Create manual and dev guide PDFs using `lyx` - [ ] Check if underscores and dashes are visible in newly added manual sections From e3c8b966f3f7c0fe3efd07e8198abb1f7bdc3e94 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Thu, 31 Oct 2019 18:05:05 +0100 Subject: [PATCH 46/55] Update links in the manual --- doc/PsPM_Manual.lyx | 50 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/doc/PsPM_Manual.lyx b/doc/PsPM_Manual.lyx index 605e7959d..137fd312f 100644 --- a/doc/PsPM_Manual.lyx +++ b/doc/PsPM_Manual.lyx @@ -5042,7 +5042,17 @@ You can find and download the PsPM package at the following URL: \end_layout \begin_layout Standard -http://pspm.sourceforge.net/ +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://bachlab.org/pspm +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -5317,7 +5327,18 @@ bioread-converted Biopac AcqKnowledge (any version) \begin_layout Standard Loads mat files which have been converted using the bioread tool acq2mat. Bioread can be installed using pip (installed by python) or can be downloaded - and installed manually from here https://github.com/njvack/bioread. + and installed manually from here +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +https://github.com/njvack/bioread +\end_layout + +\end_inset + +. It requires python and the python libraries numpy and scipy. \end_layout @@ -5425,7 +5446,17 @@ EyeLink EDF_Access_API \backslash ). - Otherwise there is a Data viewer, available at http://www.sr-research.com/dv.html + Otherwise there is a Data viewer, available at +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://www.sr-research.com/dv.html +\end_layout + +\end_inset + (registration needed), which installs a utility called 'Visual EDF2ASC'. This also allows the conversion and does not require a license. The composition of channels depends on the acquisition settings. @@ -17376,7 +17407,18 @@ To justify our continued effort in the face of tight resources, we ask you \begin_inset Quotes eld \end_inset -Data were analysed using PsPM [version number], available at pspm.sourceforge.net. +Data were analysed using PsPM [version number], available at +\begin_inset Flex URL +status open + +\begin_layout Plain Layout + +http://bachlab.org/pspm +\end_layout + +\end_inset + +. \begin_inset Quotes erd \end_inset From 49ce732ee8c2d5d909a6e81e35110c6900b06a83 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 4 Nov 2019 08:02:07 +0100 Subject: [PATCH 47/55] Manuals reviewed --- doc/PsPM_Developers_Guide.lyx | 6 +++--- doc/PsPM_Manual.lyx | 13 ++++--------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/doc/PsPM_Developers_Guide.lyx b/doc/PsPM_Developers_Guide.lyx index 0748eb490..1f0d351ef 100644 --- a/doc/PsPM_Developers_Guide.lyx +++ b/doc/PsPM_Developers_Guide.lyx @@ -124,8 +124,8 @@ If you have comments on or error corrections to this documentation, please send them to the PsPM team or post them on: \begin_inset CommandInset href LatexCommand href -name "pspm.sourceforge.net" -target "http://pspm.sourceforge.net" +name "bachlab.org/pspm" +target "http://bachlab.org/pspm" literal "false" \end_inset @@ -146,7 +146,7 @@ literal "false" \size larger Dominik R Bach, Giuseppe Castegnetti, Laure Ciernik, Samuel Gerster, Saurabh Khemka, Christoph Korn, Tobias Moser, Philipp C Paulus, Matthias Staib, - Eshref Yozdemir and collaborators + Eshref Yozdemir, Ivan Rojkov and collaborators \size default \begin_inset Newline newline diff --git a/doc/PsPM_Manual.lyx b/doc/PsPM_Manual.lyx index 137fd312f..8bc7f1e46 100644 --- a/doc/PsPM_Manual.lyx +++ b/doc/PsPM_Manual.lyx @@ -129,8 +129,8 @@ If you have comments on or error corrections to this documentation, please send them to the PsPM team or post them on: \begin_inset CommandInset href LatexCommand href -name "pspm.sourceforge.net" -target "http://pspm.sourceforge.net" +name "bachlab.org/pspm" +target "http://bachlab.org/pspm" literal "false" \end_inset @@ -18657,13 +18657,8 @@ pspm_ecg_editor \end_layout \begin_layout Itemize -When -\family typewriter - pspm_dcm -\family default - is run on an experiment with 40 trials, 20 of which are reinforced CS+ - trials, it now analyzes all input trials and do not split sessions into - many subsessions. +Treatment of missing data in DCM is now the same regardless of whether they + are specified as NaN or via model.missing \end_layout \begin_layout Itemize From 6e63cafeb364f2cdaa1f62cdaa45ebfe70d8b5cc Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 4 Nov 2019 08:05:10 +0100 Subject: [PATCH 48/55] More changes in Manual --- doc/PsPM_Manual.lyx | 140 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 133 insertions(+), 7 deletions(-) diff --git a/doc/PsPM_Manual.lyx b/doc/PsPM_Manual.lyx index 8bc7f1e46..6ab8564da 100644 --- a/doc/PsPM_Manual.lyx +++ b/doc/PsPM_Manual.lyx @@ -151,7 +151,7 @@ literal "false" \size larger Dominik R Bach, Giuseppe Castegnetti, Laure Ciernik, Samuel Gerster, Saurabh Khemka, Christoph Korn, Tobias Moser, Philipp C Paulus, Matthias Staib, - Eshref Yozdemir, and collaborators + Eshref Yozdemir, Ivan Rojkov and collaborators \size default \begin_inset Newline newline @@ -18625,7 +18625,7 @@ pspm_get_viewpoint \end_layout \begin_layout Section -PsPM Version 4.2.1 +PsPM Version 4.2.0 \end_layout \begin_layout Subsection* @@ -18633,13 +18633,143 @@ New Functions \end_layout \begin_layout Itemize -Three new tests (pspm_hb2hp_test.m, pspm_filtfilt_test.m, pspm_butter_test.m) +A new pupil data preprocessing function +\end_layout + +\begin_layout Itemize +A new pupil foreshortening error correction function +\end_layout + +\begin_layout Itemize +A new QRS detection algorithm for fMRI environments \end_layout \begin_layout Subsection* New Features \end_layout +\begin_layout Itemize +Previously, Eyelink import used to discard 50 ms worth of samples from each + side of every blink or saccade period. + This behaviour is preserved; however, sample discard duration can now be + set by the user. +\end_layout + +\begin_layout Itemize +Channel processing functions now store extensive historical data in PsPM + files. + This data can be printed in table format using the new utility +\family typewriter +function pspm_format_history_from_file +\end_layout + +\begin_layout Itemize +Pupil channel is now loaded according to a new precedence order. + Refer to GLM documentation in this manual to learn more. +\end_layout + +\begin_layout Subsection* +Changes +\end_layout + +\begin_layout Itemize +Eyelink import now returns times and dates in a slightly different format. +\end_layout + +\begin_layout Itemize +Newest version of PsPM is now obtained from the version string in pspm.sourceforg +e.net, not from the download link zip file name +\end_layout + +\begin_layout Itemize +GLM now uses the +\series bold +LAST +\series default + channel of a specified modality in a PsPM file. +\end_layout + +\begin_layout Itemize +Nonlinear SCR model (DCM) now does not use the inter-trial interval duration + value (ITI) of the last trial when computing session specific minimum ITI + values. + Previously, using these last ITI values would lead to abnormally small + overall min ITI values in some input files, thereby causing the inference + and PCA sections to use less data for all trials. + Now, we prevent this from happening. +\end_layout + +\begin_layout Itemize +Eyelink import parameter blink/saccade edge discard factor default value + has been set to 0. + This means no extra samples are discarded around blinks/saccades. +\end_layout + +\begin_layout Subsection* +Bugfixes +\end_layout + +\begin_layout Itemize +Fix a bug in +\family typewriter +pspm_extract_segments +\family default + where trial onsets were not assigned to conditions correctly +\end_layout + +\begin_layout Itemize +Fix a bug in Viewpoint import where files in DOS format were being parsed + incorrectly +\end_layout + +\begin_layout Itemize +Fix a bug in Eyelink import where blink/saccade periods where misaligned, + causing the function to discard useful data and return noise instead +\end_layout + +\begin_layout Subsection* +Improvements +\end_layout + +\begin_layout Itemize +New utility functions to make PsPM more compatible across different operating + systems +\end_layout + +\begin_layout Itemize +An optimized Eyelink import function that is significantly faster and more + memory efficient than previous versions +\end_layout + +\begin_layout Itemize +An optimized SMI event import function that is significantly faster than + the previous version +\end_layout + +\begin_layout Itemize +Multiple new tests to validate the correctness of the functions +\end_layout + +\begin_layout Itemize +API unification: Now all preprocessing functions use +\family typewriter +channel_action +\family default + variable to choose what to do with the new channel. +\end_layout + +\begin_layout Section +PsPM Version 4.2.1 +\end_layout + +\begin_layout Subsection* +New Functions +\end_layout + +\begin_layout Itemize +Three new tests (pspm_hb2hp_test.m, pspm_filtfilt_test.m, pspm_butter_test.m) +\end_layout + \begin_layout Subsection* Changes \end_layout @@ -18761,10 +18891,6 @@ pspm_filtfilt which crashed when the filter parameters were of dimension one \end_layout -\begin_layout Subsection* -Improvements -\end_layout - \begin_layout Part Acknowledgements \end_layout From b9842d251d9ec4de60bc3c2f82551c1b881d81d0 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 4 Nov 2019 08:20:14 +0100 Subject: [PATCH 49/55] Modified pspm.fig --- src/pspm.fig | Bin 26445 -> 26503 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/pspm.fig b/src/pspm.fig index e34ed81db7c07643c5ccd931f5d4ac6fac7b4d2f..a60cba616229bf048e7f492e0dc266d38b5cc873 100644 GIT binary patch delta 19595 zcmXuJbyU<}v_1?1A}!L=BB8WM$Iu}H0wUer44w0#yOEATkdW>UK|*psI)`o;x`%nc zzkBby|2nbOK5LzI_Sw&V_A@q)9sxs7{79+d?8Knz?8(6Jk%31@gjYy}pO4`K53g{N zI#ZGf7J$u!_P>U%q(b!HXqOQU%{%8vSIU`0fs{^^(L^sXN$98eWEq)kL9H$E_fKTm zLRfE-Ha6ZKGbU4253VvE=FW^dDEc1M?&c->p3we!bwGUe^-AOGRp9iu=rUaOuZ&M< z1$^y%*S;MVbM{~LqDm@OyUscU`QX_B7r@Ro58B!y7aCtM{Yy1s*#@<2gX8|$JH8Z0z>jVp?$@6L#~DS1sq=N&b-qQ31gQOgJ(fpx?XAw6Qn zBs;u?EkEm$MO&!9d@KXi4~o1^{pu$>bD@Enopcb|^MJi?`Ma5D#G>*#NIU)+^d#=nN&IP4+Nz(ukwLt zma;&GmdsENAIRe=oZ!YWi8zi^PX%fMJZhr&IsNp_FpPs697zD{iPf5S(nhq-OzAVk zhSv_P?m^3Hl-*|xz->$~s$V_rf(6o*9=1hHv^|+pvix>efAKB= z4IkRA(e&f6DZlgG710qrw;Jf@)?B|E*wJUdkiBd4Ih70J=HW#Du~gH$V^O}%1yIG- z(gv|G#j3Ol>wW4Uu4@t5E9N(0KU*p_l%owWGspS%zdYeOQrAMtmJio-1S*pvfmfp8 zomDX{!;TAt^_Fkwiy88_U-@Z1((MoR3#^gbjg(8V4N<6VpV{7J6iZ16{64JT@b>O3 z+p;%t0aCWGM{Tjh4Dgrbk@h4CO9tKT8E51Rgm8=_86vqG1?X)McU_&N8O~A$n~d)H z=YJLJ?s zsIH;&6)}doy4<%tED`JiE;^k-qgpT>plrDQO6%pvvxQxRI*;#@M76IY4dSOy zdaRGK@Na=LA?7MO=uf8yxplBkGqUcZ(UbZ&*H#`qXeWaeg|ofOA}s%HW>KFUaeMoB zOe4{M`J-hPhD~IfnxxGo5QN&Figd1U+woVe>xMPk3|1>& zt5}V8zPomKvTv&qpNROc5#b#j&sAIvh&?Q_&Zn&H3P*r&c%U3zA1k19)j&N285Pa9 zTVVrARoIX&_O<-+vTCzuTCzGPp8^i8LwRZ5UDsn-7_4zQs7nLiK~(2q=H4g(`}1tN z$3Koz67Qzv&nj0}BWK)2YgH%&`n2y)102fA$cN|d?Cf~u=@jJb+VILek-6cG!QRBq zXQhD-Pl8t*Ma|+n0b7yDb7tN){u}5TjNx&B<1&ML%H70C^Xl*A9wSXphx^0`uO1%N zqKXpJwfB~@KJ9>Au1i%z6;n1;R=+pk11uwjsxNBObufn7QBxszlU2bt@94RXtE0IS z;ohCjy9=dg_?NfsqT;XiZZmdRRluTp2&>PC$Vs(Tfp2!&uQeb9u}4$IIBl)YL{t|O zwem~p=MIn}RuJ*pp6>3g;7HBn!_%}d*v+B;X*|z-v`Y&goP)9m2)g>NE zuVH%h*A5_}=M}ZB0=uC)e zH(8E}uYni!OD!HMa<**dHL@RuU}raXBR8;av!I<+GIQBjt#C%-n|HkA{gh zbe>6f&eZ#_qIUx(73hPxI2T@{3SHX7$49WibM0d0NocJGJf8{=2lotm7y* zg;oD(GH8m)$%DEg(|=gpal}42Bu(!>PZ75$4&gN{u*g)@{VG&%1_MRgVL;Fy(IEQ2;Ec5A6 zkaiPejD8pt2o0~?u=T}H8IK|vjxTuGR=Gej8bCw3-D~!umB_69K)lO(@U*;7{qC-S zZ`V0pf+3wdQkJNN_5Qa%W!Oxs?xgaC+>EOg1s8{Y>2ys8JJ!X8(t`lLjf-9p{|p7- z*RNpMM#p@kl#(qlt1CVA&D2kAV{lCxLat(+eJ5f&|HC)_ANSeki!*C^zmmM_3&Zp) zY)!7hA?9Dr9$(2V9YzXSr>RYnFKB0lI&nk~^1DTHVrx4{D9@S`O}Hi2lKs;w;-&ie z_930OpXJ3=0?TuuOyRjV>2q=XJf!>3$P6mKOQ6O~&}{Uh7E?uNuWX$4&8uy+Af(!3b^Ami!=8;L z^b%g0*V9sfhp>$iYq{kY*LR>pD6~_1*Jc=Y!VDUDeeOzXaUHqXSk4nj)(2Ge!w$GL zA9(1_-6MDH*bWTu_y3??1 z*Ym@bAa%EL7l%q5bn5jYV_qS8K(&*Y^@I!9yu=4yOUp;m|1`zA+~!WD1;boBOX~-A~_g%0LVF2?=$6bEcY=|7n@o<~Zee zbD_qe$VhcN->k#nfApq&UGN~)>R8efT2MQy%lM-i&4giIYw>|I!yy1Z*4ms z#ZT*8zmXWuj_yfGmXnl`(*n{3vjx>(UEzO^c(|$#8`>E{{#CoX2sI-%HTddT6lR5@ z+r0gHEu+EQqWtg*ET!r4xm{_sn38fST&#qLp7r{*ZWD8G`L^WBYbM{hsw*C_@Tb@% zOPb8hvOI+vjMTrmHWK@`kZ~Y^MMBOtz+;EyesE})GjX(}AU99UQ|K8O^;vcH(ST=* zZP7fVEKrRPgmVxHJ~GBs>MScm)1xC&Q~QuVwMVfhJL*Y?{Qb0lH9~LPyng&!AmSw+4Bx&HBsG@+M9cwQT-9I#6jXF z6HI@nFBL1JCYORXIq= zUGTEqEMe~-Ckxng%iTs$Tw461vI2C`bgIFcIJ>K1DO}3P`RA*Ur9^}tjQp)jWUQix(3e-{M^mX~M#_ z_)9-g3z*}%|D6CaCV{wr{diy8*XNZtIS<`F{SgbGZ zL1ygg#3$T!$#b8phc4gZLU0PxUfT0L>5hPd4MGnNZ0u)z<$tI{c@LTb;h6)~LczvT zn}S7FIWasPROIK3Rt?}l{Zrao$G3k4c^TjU=HhCZ`~DGToBco=8s1@*gmvF}HW9-`lJ?{ilrJu! zEAOrNs629lN?NwqB`+@&ni=gAe1*Hei=hir8`Rt(Y2dp5l z7mdkl+7R@+@=M;yGp-Z-HRl(Ojh4nJfnf+?j=*&-Qxx~TfAW#*;u^;M<}{XNNs{?^ zJ~n=|d9R%-yzE5Q^{DXTSgF~$hP50h=`33@lBnXQhu6yZ3;L!XecaUo?aGDWhDmGZ zb+g>N7ZJO+1@zuRS=*f7UaJRA;CFc*KCj^d<2j z_K;?^m$!7By1+cR7s<44S~BM+ZJFK1PpNZJ<4~wrRUdkF^x7ATBMa&<&wku_-`tmE zzop}7EOQs6rRJTRx_zL^=_xc~FB3AWhaTqjxvMP;?rfgkUP4RP2jR5^Hi|Ez_Pgfx z$Ya4+{lDrOwXq&0Uf030egO_sM!WdJW>As~><-eW$NJI$KUUv_`l^e^5GC#Dy~W*8 z>`iCt3-l`A;Ux3)Qrg-q4i}4wIO1LnyShGN4^A>`>N5Iv!rF{F9085-k7uB940uzH zHQSOfouC@W8^fnJ!GXy)9g=x$S)Cuj6?fI=ec+2ewf3|2kEvsM8+ts6gRUg>G&y*9NFYW{CGePT4{!}osH9U(riqks39%CC0f!F+Ci zy&Zk&e%)LpYq__c4^~_cD{AhDvnH0{eRnoeq8kEVOj~n9pDxe$#UB!!+Rc}me<1z1 zwev*GXmvNVS37P+F9BapNzD;@LICoR%v+2!=er zBFbnR#@*v>jqF&Ork;N`fy_Ny-AXU_OQ}6kp)>sFm%@s3DE#pf_x90`q^4#u5Kq-7 zz|{i?mWM<8>;c0YR^3P0Wa#wn$cFKlm_2VvPI@!f6Guf1#rd6zy{uu*ck4`#>S(f{ zcw_6Z>lb-F z*gT<}L85d_Kg#NN=uznZ3)aT|18bxuIV`2^93F0gdNDFo8RhvwB&~+hi;0XwE35hONel#@u$NOQ+ zNZ-C7{C)GIhk4q4a*I>(RqIpxFk|gI4=hqGa8 z@pjz!d_UrD3Hb>!7?vt4_HJ6Rn{qNXZG=rC9b=ifm*NIkZp%-hhwPGKSzZLF<6&yx zQBBKZj8|GVm(^9zX$xkuN$?IDn=N#xNQ_?<9dRgcEu9q)2fs}zc*8y%f$5$Zo-grj0wZK=s z1rU0l#9oV3tm6+yZ&)Y2DO&)RKYhnb6OA;a;{g4rQ8$005lBi911dmkCSB4B7xAB1 zwDkn7+*|nNFLL6kDX-h+j-)$s>AD^HGPY^F&^B=Q=n=6Zq*w(j$TiE zjEye}=_a7HMjI;>&9;_zj(^5+f-^oKza4;UxRDpDv^EI4n0;saLACd$u&=o+c1q|U zp=?sCyR+(V?X!P}Tzids2q^zA?nxiIPOE;L)M}Qq?c;W>#5}c$1crWp ze)n~Z4AZafhSNgxYXB)eW$O!J2-^1b=2Zr{7xw)Tv3rfj3k96KBqrloAJ*gVQ3f$B z9g!n)8|Q-2hFFGgxHS7xro^W>Ni!(G!lGQp7#D+<=Fg2YTawbTXW!;z{rzk|bG}fH zb(u>xNa7Q70NvI`-x(4w>`QVvNt-AnEIup<8RJQ4I-J=ky#;*s%+hXKZ2SyF?sOB> zjh?AKi1rP-F3+!1{fkWg-MHAdJ}EeqmHgBcM;lWxbSooG6E2=V@z5uI_DDM94Mxev zrtJ#Phe~6rzYn^lR33u=fiq@4y^hzsG!In}$X~Ey9aSmdde5o2)`g_qGtoQ@6*_4C9iIg01Pjg@1eVNE|%&d>P#0g z(tBHiP&Mkv)y_?$*gdF4zBU!@q*y_-&ujF0di$n)m%?WwYr6G{4)wrkV(6#_zZ)ZxVO?0Jn;3eHGz;<>CH0KCzJz z1IF$QM2gBLLi%oE$l6}s{E2Hlp4dn7IT_J;%k*?Iu6ychislUZhIvykTJKim_;?GF zb!2~7H4?*ksV^4b3-&@PeI#ZWy@GTzRb!F$KRSZIO zr_J4F%vYH!2aPQDE(HIN4pRG{Pm3cLWD_BvJWJ>}@yGq$A{u(K6XnD+jIwDJ4HJGd zj-i_Dk-rUNVJukDpEmMR?kQ;iaf6zSjGf z(bYwsax>0~(04g%Aw1&wuoLVh`X)XZ98&Lt6Yt0sKl3m-sgDjz{ix9h)HOSAX$A0` z)3Lqx?u_#ZNxJ`)IH(?pv9Z?aa_aOnbpvwKiX~4_OJ$7tjp z-k5{PR_k=8Ti1zV9yD5dU~;M3U@Q(=`-Ho*CdPG2J2x2yN}nutz61=}nw*?j>#6}l zVJ!gx$E8W~-ZKj6e{;Sx^_=qh9fcIQi`vQO-}JnUJ$gRO9jeQIOr>`BD`pQ(Bjt7e zim6=ZP^6+OlRWJPh)Tb@UH(S-;k60IodNeh38RYdZWg?L;iW-ni{y(z@Y8Dw%HM~_dEk!sB>1#e^}6%YT>hX&rf zUJzQvW5y|Zp-4)wVL~HHDtx%0E|Xr3p$)6R;J!;3Z$?7lK-b;=adycQ6v((PLI9?V z-D($GID*~Z8^5Q*qNmlu;M(u6E+LZrvuCAkBMRxTKd(N)%9Ca?KWOS7!j3M_?>}A^ zpLL?tjC`gyQ{mbJ_ghQsr$L1!8cT` z0{P_CDm7n?3K1P(WR2m%m0}2?fP12Ioy!S&j-PG&^lH#lA}$eZ1_-{HHtShYh*^ zS`UjUvaJuT>Mc-o113?h#iUX?4exM5=kdYGyx7ZV9zqWfI?-#gZN8DzlsR+bJ7f^6 zQogIIJ#lyetC~ixVJNZ&9`nA?m$^$-9T)W zKsUu?w$0>n8r9 ze2CvIph?GLc8Maa|GPyk_A}Yl_=0-gZ=PK2T;F57Mbcw*zRGS2H7EML5tHf?zLBH! znjr?h#c6hqQ9m0Js7~}JQLwfTuwhEp2sjTwrD1q1co);C`ixRlrz)LK{4TW&z z&aLi4X+c+xPE``4^&)|}c2aS|a=LTg)A`Omg%h-!ygMm-FfTJyobN9eVwW{NtC??h)Fe(1;+)oa|f@z`^r25@O8E}DF znQEeB?4V2{Eu!IMf(HXJe2gOky_;W0UjS^86HFb?FAj6{v3FuMvt+j}h)t~DnNLF+8pQ`q`USG(F5d8DwYvT*Yer(^o zj)u@=PjtW{g7OeBn5~}jml)giIlm*CZF^=c1U>W>w3deMTwMBBnVV_cbwnB$o$|RLUjw8k-z5!*3)P^F0%fzOMM%W@2x6sUEX>pF2~b={ z*$q16PBvA)OcD!T2y$2^v@rKzpsvPPpzL&xVekY|#{f5%y51cnu-+|60WR#i+EybB z5+K_#MERL}os0KmirV<@p8+XewZYGvoG@M?ywrw zs*a0Ycy_Q}*Yd#n)uG#J2C55o!)4xl?tP~dObs7u)%@m^eDMh6Q9!T8WBS8fJy3ST zK1m)4z(W^&YNs_FN$y4RcoW(r%F899v@4TFYkPY~7vwj0kOeRMptV+Cdw#Q?eu97@ zQ1_2dmd)^d1TV#4+u&n4!wJ$c+HbJ8vj?ZYGlJ^ER_74+(Po+bZ(*aEcDiOxcDx%% zGNr#&?x3Lp>Dlv|$XgVl)qc=tx;cZ9(zHqYl58nL*TZ7cr{}~QdNAlE+%0ys^K95_ z{Lc-5mcsOgA2Zt~^CrdMO%A$u{oR`wDxh2Wk0fc=CB<>R#V;Wdp}l`@?tC`bw4qPv z!Lx~r(kavONYOs6Q)id=@wBwGG?-+;ib-#ZfZ+7yc3)wQisCPLh{?e@ud$o+?REw3 z*Xy-^UDGY&E%UaYRapNZoaI-1cJ%>upQQnr%7+(Ea~EAsk*cOyyz%(mopPJis|_Hc z?$tpD3dmCWt3t?h!vC8zXMIRX&gZ0` z!uw!-r<$*fty2$OKs#YK=>hsH?PgFJCWE6YYTAcZb7T6`ML2IUKU8ia?xG)Km%VgE zGrOAkT-?~TTPW97j`h-mmYZ_;5}dTheCvHbvm04LeH~MpI?@cw_*Ge!=G?a=Y&T}@a?+_0>BO6Jdj+it z`tt~`HSsl!HKsL^HN1SH+vm50^B9k4M;MT2glG{ceC+7)u5%jkZDF9_jg{aMRCd_> zghwCB-OIY3eX4%@-k-edzh&rV#Us@4v+L?#1cpd?@YMTB;Z%A+bw4r5&F(T-;P6gb z_W#+|E!O{*`f6$5XPSST#e`@YEgE1l{E?_kPo-q^1Mn72kaL~z;Yf2CL4ls|02a&R zli;ofy)}fUR>A110XFj@%GHLzx!rpDN!Cp(mH1uzw)R_A)XVM;qghe(h-rjYTf5Mm zaL`F9Q?UAwfXYSy!iKz#nAh>QW5`~3cqUF6LE&fjDYn@}^`6D3j)&Y4(+OX$U%Adg zo^;ukKOH zfoxi|&8iMr*KOuM&JhbLxzp~2irgG}k<(}~FLx545um?( za3Kb_7}I!+!Az<*{@(V1P+|vNwglKzpf!Ok@JKx+s#%rl)`^*_THRR&4pU7`+3_U>24z?uH%kUoF zkkXqu?f3XV8CUt_!~+e5i!0qCUx+tdc#z0$-e85;GzFb9RYt$gAa$71lm8|}Cp++s z1J$nTMsM(V-(Lff>c~lbEOq4nq{BT3Y{HL`77GoHHjkJ1bX+F^`pY9dH}s`jKSbIA zA5YY-ff$S|zK9~gzjp*h#q9+)`g4BHxds~ni)s6@uJuoPVV{j*G3>zWhp44(nVNjX zMxI0uo;Hs_oo?PYIhT`m4gupY6z})C!@OWj#^ntAg((tkGl2G~n$i;l0RX)f&0k7j zbG=u`0K!H{FWiTXQ~eqx8(<*&gIN;vD&v;X7NoJd4TC6pGU z-}v^U5_EW8eQ)~mE{sg^#q&?^wCz0DF|{4?g-A-M4i=dbN+xJum7nO;Np0|Ye|LI+ z_CoC0X1q9fnUPOv*EI+j_&1IGAPxmVH_hn<$2-Q^V37I}!pD+)!$|m2As9T7feSS&U}$)AfCHVJ5hzdzmWoGFifkrW z!~(07sFvOd4pwt-jIXmCt>pJz-Q45! z+uq85pR6Px4+9P^I=uI-&TT~9I#qN$%}sWd>Q*-A2BvUC&{M_OpTl&X!yBxkt|vmdI`{#;;3qk42q=oq=+?<+}6j=zoSgBFGoW<8~6< zk-Ypbk1>&O|L9q?>s|A-Dw2sx<&6N*0$<~A5PMp=S-DDOV*;IW4~BN`aKrvOK68DG zF1a}zNo!;Ni%vyUvo60l2oGTN@Dpjk$R(Pdqz4&b#jypBH{C+I&t6)iGm)KFd4wUB zNbQX0D{S?UTO;A?YTxM;g&$txIsB_s_F_@nLqK0<#GeUU^S&@9JTx}X6Z*#6w?-Mp z?k-bmc%MWOb>3WhVifHjV4CL;S8qFy{vE&Z4e=6h;=y<|#fEiFS@9zdE>4OKQO7f- z$G;^i)|y5~IcX?QHH*?KaoBox!++kQoznoyAcuV&~!#ID{JJ&&gOQ2R62(tP)V?_ho zb+)#)9$fv1W-{s&UK`BwJ~P?$puj>mx(PcncF}RgNvWM+!4XsFgQCa3K^u(AF7WQI z98H5|;5DXmR*zeCyEi6l&sveAO8WK}Ph+ZfN^6SU+lM&8ecn}kKBMby%KmKg(+wJ< z*m|l4g@FrUHG>4uA!{B8Kz01w9KtiRep@xjr{ZDLj1j8!mEVI_6s4aW^f}anq@^vK zOhw}t?p8R9ncUoakDoJNe~loFF0#>&9z}eAm}X*WQ6%Zj8!RvA7`*>(U1GgcF15it z8$^MDMTEkt4XHAG^nLP^yz+_#8KBVo9TWq}bk#+^C{bmN@p#Q;+t{hi0jLlBg`Z|j!g#9{Upx!BgLUL4J>vkcU<+4 zMly_@co`$aMiUX*(VKGaKlc~Uf>vwxJi6~(!}`I;1vEzCD6MzXs~JPm zFMr4IdA|$CLjzIl0Yr)}pCp7ZXyVZxF?$&fW463rb-S*7^FuC&GCV1VU=Z~11TCykQ0d&;H@(9iCCV<+epW{BUgJKMvSQZaVp-vnw6MME?qT$ zg>M8hMpfS}f{gse=Jr~bo(^jm?bR{ zw1^;Yoq+sDY*Ni}=M4%kgP%8d%wNlpUd;48P>TV|D`Ln~7NHIta_7orbjqJ6R6D2P zR2|1NMRgge=(c~ z{1?QHUw=)1Th78DV_;-H#?ts@;d99x^t!PD`|G3lVx>`tIR=^J~vHL%k`=Z zAe|uYDz(9S$vT~Fm@>u^O*>eS_+J=%(*X7GaS5wBTeOVx#g9ChTLLpUtEE3XJrl(9 zSbuQ7t3r5Jj&^5n=v^uxKfieTU^HR~`07e=dbA8(P7_a27!zN$)2wN4Wv(MKm+4=D z;Jp->kFrGm8o#Z@M?UI^IpK2McZ?NG)fcAJkG?YVBsTQknZ#+>xc+p?US0jsy}Fv} z+B=UFqQBAct6QeWSmT@(w)u0=H*4wZ;XEUKP1Q`(8JA>>cag|OYH)hC{>zV5K+VGd zf*Y5p-iRLeM)NoG+Z;+is4>mO3xkmd-chk(e@M~uP3{4u9qyZSt0b|K7PVhJ-d3$~ z9Zd;Q@#Rgnuddq*_2viq8hV-u3aHA)RZ82#r9V!UeymZSnyG5J$%0e8+)ZEbnXA2M z`(+~D-PqRI+Li`9{5);ZA*eTc1<*ddN<nbK=o4vsH$Y=H{$8&ZxA8S-v$_y5k9uz~m! zBX3)TuCG2c+<1JYQ-`hZ`IPJHtV*Na!Uu&3Sz71Mos-N5u4q%h0Tj*wH>8VKhF`k; zCU_;Rx&6Q_w7eNl@>J3wnxR3h2$nkzrU+?U<&QE{kMaTHcI6kx;_IHyuN z0`2)v4*{Z6KfzX~r<;a3MqxMV@A{tjsBG$c8bsWm-9Zl~PJM)d1BhG}8Z}z}3Q^nfLoHd1quf0*QC#Ew>5UVEy z2vxu$q7%Q?I3+q=gPO1mxtEwPj#+7fZhCk+jvgUCi0!fLbcgX5mh<%3$lAac?uojM zytq~LXV|9-J@g?@dkM2dvc6n;DVpA)U3;e4*#JJTReLD&rf})mivaRTJsU!02UyJj zlYErx*D!LycdpAUeM;W(c4E>{&$$;N@exU_&xG-hTBpKyzYj27wudquv{JfSh&0hN zYv8?@y7#)kDd`mtwc-c9b+j9edjCnhs_^`*;rYLheqF?YHn03q&J zS@y1P1!INYZ`%k2<{5)K0$wBD^>YP~`y*~2QcWY<`doS!hCXJ7_5;tOpoa1+mgbyoW;#` z$!4JWCEqB;agsjlN}Ej9eO+A1-v7K%?nv(?g|)IWU(sQI*srLe5i)T?uzxG9zi=TX zN%vc!m+SK9x%~*8pP(-rjGN}C9z;}S4)p38vj%O$Vm6M(hV?!xES9x3M^Z+DZ-Dl^ z=Cj=&)A=NqBA@@iwhJj-$hZ3{1d9?ZW?ctT00g`?n*Yv6x%9r8`Aw7L~2KfX|`>%ItoUDCnm zxeX6}Alr3a4B(?(=%l~9@7=3-qKkLuHUE42q3?S5RfUqo#6VXIMCDiPlBZ=YY#W)f z6}CuE@Q|fn=^1u-rPlfMYYudL0%PK=l1AhM1%H8eU6x6*1k>IBKr0{H00eZgpV2np zo6p9$@>LG4hJ#I~b@;CNy_=UHdUuiW&?*sM{nPrl(EY2DAD8!2k{?E@m*mf%F1H9# z(&D${N(_1OTJyjC^V(K9F8^IQCRSMgLp^>1{p_1LY-myTTXU5^T=4?unnJKF3S%JE&e^!wox&H{MeEid@4M*MHuiEC7R3dI-Z}0Q^QTS?PT^wB?_ckKA zvHi|!L_qiIL)+E^2tEh=pMFnGnfgD5Dud0pMyEy&H!Ms8C}4P7Np`8Bz^?IYa$2@} zX~=5Mfz~>0MYmG$2di^YGdZsKEu*i)4{RbNno%eOjVKHfbYkH(W}%WYW`&&kNEDtf z*xn8A%JjLowiG}|n|INB*79LvA?=z6Z;;)-Xs)c6WyUbI=7X6{Z%u6OnfvPS?iN-y z?YA_lmprTgy7kZw?O4mbBHLBnatU^3CuTtKZ^#_m9`<`-%s!+?iOl0|W5rGPOJjPFiw_!t zehe;p|J?LyV@_r7BxQ1bgMIgocFX=_SG&ii+p%Tu*A#}1QoFwc9L^d{5wSKt#7O}! zV@rUp=R#luBw@Xc@s*Ij?PXq6bhd4m8Q`y~qbc;>l6`V|S}K{-)&PY zLxq|0ztVSPX_C8OVCPM7c?>+zn5+*2YwE@!wU(aQ$4VE zesc1=4(FkNdPHk-E|nxz8N8zPn+BGf@PFpqoa|Q=kYvKys3Wxkcju&H&MKboq%Mth zW00n8S-;qPrO_kVaM5aZOAU9n@mT!)6*;IzIa8brYEt6CEUN z%RymiaW?Ab7Y)yQV)d^$qV_Q`=v=ubs#}Er=t1P5YZ0?ibzcE~7QoS+X z8lgFNu-I=3#BV-X{{+T%^dG2U@z#U&+0V4Yb6KQVGZUSKyVY_9_8J&V;!fFh;}^W6 z1=qZnk$&IFt2)8cwJmM;pSc2>=VZF?Z{VRDkJ4`(ZXT zCLL#nBltA=o0P|AL5@ELGFBe}OaJ>1fr=QxXWt3eqb`O;vgG_{FHU8rcNd7$1^u3J zV;y@Po>2-MGFOxjor>N$bNsfx&6GMZ&$aoR+(a%|l%+mfBM6;8gZsa+C*A~ouBJ5p zjA$vLfWWZ*iUCA+el@M}v5?ri@r^3bTEHtXN_;98Y3Bd@m`K8TA}*9^z%PA&d|W-= zvSj9Ef2jr4bC2q!tSAmy0z9$Lr6lqhGNsc|pFBd?v}A{MVo0HzYYA%MF&<0r&1B?S zTAFG)+fG|rgvGB+sz{mDiu~_2zTlr3lje>3Xtar`c+P#g4P* ztwsI(mjB81r4Njp&b!-LybeVU#UVc?>SRt#23>v=h7dIGUHp5DpA^2XC1_0tTc#pTJ-2LioLMqcNSPTh1@kM3~?lU!Yc;JGpTNTUQ# z>S~oeE=0V`sBf&pJ&kE+N1P}6#!R!SKGqC?_bs_xr&Y6TLD?ff-w5%}=eR#dyF$W;pm!GI?2E3iA3`8`T~Dhdc}2mJ}bCQQC1`TU4+(o%oyuD@5up=e_K zA+u{G0N&;EFgDkGT-RS~&R7=;5Ny3N0+)7%JD^ozpjmbD?!SaT{K(te_+tiR0e;BBQ@PM3Hsn{ymeJi7a(2gZ?88AV~2Va*;*8E=yXp{RFA8w z+7r`#!g>n7bee$<-aOvT`B6fuLR@CVE+n@XDm4cv)_EjiS~$M=BwA1$(&elAcC zfE$x7@|L)Dj7SBh^mPIFC-h+yb}P7f3Iv;9!AdiX65J1CyW1hCI%tYPg!Ajqb^yP{ z=Q4O#(S2?OM6kyMN!QS|Bz|~-+|EGmGXzL~Yp+&|EqEvcRu5ksmE9~TM>36h*2K~D zsn{|1K6HMlpzftB4iHfExUbk852*%w_~IGlN%$o~IGP;}T!2oE$!yA*S~s%$qf!sW zhoeG{R*CGu23QxHh(Fa;JJvr5(c^l*&4?Lb<-n!YhKY5Ato(Y&u>F@qD|2UD6DQCm+p z*!ljVl2JoXf8M~*TTibWBr0eeSD=|m*MZMQP-^^Lh;1`^A!UYp-kCeq7xN0e!_hoH z%QSfvLv(t=FlCb3~lY zbZVd2W-nB3e6PlB6Dr_-BmMsc{R;y0s;IU#HPd(XOv5$B9N{cES5m!p6E3jhHB|Lj;#PunmQH!ZC|jEPCxgm%h- z36RjrIE~8)V@w+Ytpc`d=caC(;l`Qcv~=2`(oVbWi*VmZ*az5gNc#x;2(uf9xFL}A z4}S)+WXvzk`}w_>=V$xn000xbkMTY(N6{vE*MQ&l^xuD5N58g?p6DK4)yKQzjDDB@ zea(Ab@=QyKoWyy_>GKLa>-~G2QGWZxyTF3aR`|w4eB#|Tg>OdU%|n||rnQMnwF+cV zs}ic!C~<8Kqb9-{v>?@B_rBs^zxneEzU3IbvORib0jXAp zk{gvDp2hIwLOcSmQxjq-UsUAt5%Oop|LNwG@pm4xMdpocQLAf4=JBIEdm^^_-N?z4m`#Ncn{;`QHCed|muL;ecSDQ2CHXQN9(tL{;cwR;0wkI0Pk%Ko!}^Ek%X<-UEaX09`_t2p6P@=4WEhqyAeY#{rx^09z)tn?vc6D%TmFa)w#07)787U7Mcc6(3-boCo|ZNs#${+6%rBjK zZK>v(V)O|X7n9_j$&elbLyK7L25}wve3-mDign!t!MeT(J(Au}vI<}Q96bcjN=SbX zfnS-FCv)$rXUN>{bT5HTNKNkV-~!k{tWGLUFkgC3y=CXrKKAQD*HsGy=hVxN=MLyE zZ^zX!;=YgS=NXPfHoXaTi$U#9>lD|&PH_m*I>mL#<2Nz?w?SH`Nb3~+)hX_TTk(Q+R*#q;-m(2Ul39ps0CE>l9x=u&%F5okGpSQGR_C z(nDaG&!JXTE_f%|{qoPF{{R30|Nrb*Pfyf96d!ik4II!lQA51g1BN9bE^va27Bx`_ z#Fc*sF6-=W%NAy5nsy4|pc2spKL8)Wg9mON{0JV6@hFKO!7pH9hiTbqDYSpxF8@18 z8GdblZ{B--@6GJX0RVdJt4p}p=ymS%aYw#k{~folymLSAJjq4k7Z3O&0>3+epAq;4 z8xah^W#W}X{L}68k96pt0r~gz-mmGshcd?#GGDiF;I|io+&-V&Jn;IR;eP(_enxoq z#?jlaXOMmOJoa%sr>twrh6H~lRWnQ~A!S`bQj^pb#NT6bw*Aab_&qxK`sH)U`%c=y$3VyO@U6p1rspI1VA`7DbI&I}|Ji>|Sf|rEf7$E& zJJ720qP!sc?t1LwcnVX+zz{uCRA?buHi$k8_4eu@#GAk$Pf_*-5uddk?hxgEkmzhU=b9K55*4-Ch2&yL?~f`1rUFk}Jj)liPnN_wQr> z%;bF&XS~w|86;WQSgWBA3!&C1&Dt`)sXkb1~Jx59o7!- zZfLZj;R<`PqC?sM;OIF#$eyy#uMC^&gAuvdcv)RlYIN96d`#<*!Xe$%o5jHz!DE%D z5TPoptql$zd2M*b(%9?@7#fOFcY1w#Fbpxln@wVw&iy2Hw-b5&9<=iMH1vr2dn9{| zyr_9&?}K(aN-KW`v2?Mpr{_@DPuJ@l8g)NzH*dB<^mAz3c-;c=>Taj|46GVn$3BB= zciLyT_CAnh|;lsbJC>-$HL_8HPXgO?w7KY3+oG+CU_%RiS^KQFERbAJC%$o#vf zeTAU-{&7Zqg+|&}NYqy-UeLb6PKZ78KEE=2a$kW}faiaUQ}J30z|}_%(dRPs7j{4^ zzt5w;@E-sG|Nrb+&2Jk;6d&BgO-xg{QVInLsj4_o1QwOrs(b_+653j7Rkvw_gd(-$ z-Eln0cxTz2jgoQ+;s6DKxY2vXkt=@%2gIdZD)kJP+z}FQc4m_C+O;>kTS7%f`f286 z{d*rX&u@SBIS8q7NY6(B7XW3z6ktOCeNxNMS+g8fEnni?ZEupA(AkYKT^IPQE};3GZnv_;7d6m zA_~00{Y{?NBpN)gS+#s*Vn>$UH2G+sR~01Q>Ez-)?fsif@TL4gKruskzei6Rt$nFK z#m9f~YGL)@Yt1>hZ`3%rZ({9*<<~c8_ARQbr(F(YK75mxh zA@(*0>Qb6}#+Lu>ILxs189%b}vfOKa)MnHvhJPPDIj>$qgL&nuWt>;D`q_(sR{*B~ zr}bW(1H1?L5YPl%1Kb3B0=NSpfK>noM1X(K0G|WCM7!S`>EFiTZ0{j21K{pk_~@E1 zDEGpFmlCc2_wwHKAJy{D0PG05PHuPAQ-N2g*WvoJe4PXVb%~M!!Uztv08&Wr8UeI8 zBn)YrGAcGvuS40+BjjMl+SpkOV=1KG3L`?68Yyjt4re^*P#I5~ac2#lE1nE?5wCv} z_oCD$CAsi$kC?dad`;FVGweELc=tIg`E7UocvQc`PF^q&*tRkJ-@+v zx;Ososornw`@ag3$32p@Uo+JqpWlDm_5T9j-nZ$}Xnskria75s8olplQUAV6dH$Vc z7Yn@1918CdbZz+xhPpPd1wZtAZweBMWf4T4l54%R_Rc5lozG@3z7(?djjB$c*_XaK z>-%_-eREOqo4=c!%M(Xoee0I)2e-a|#` zX7ny`M-!yC@mBOP#t>9wHe&=~q1Ej7W?T#aDi6Ou?kxQyjs#D>uM8RERZxH3m$Ju$ cp6zlT`^EiVWxH4f@nuX0COS`>OHS|wDu7t0*r`$LVKJ=quDTHvKhf+VH_+K@b{_?Q+ zbDTj*^XIfWeF0LiURnZI@9?++uHS$DyX+nC>jRWNlQYabI!->+w8JaSCRYIXWe|75 z7ipl-9tRNLmDM81{*D)L77jk}C{N zJ#jUAEhb(Ck)l73qNZ}pp)Z1U?}`WOk$`w=45=@Nd-3uaoofZ`=wZIq;*D*wSEGz#=j z>Km+Ag5R!8I0JWT%fHJj>iMCio1SMszFpzPzAtuwNWNaGm8Jm{k5CVs^=Z^>$d1r? zKb+f>PCKNuF#^$7hE=$&QpWojL}*}*`k9NO6A&vFmL$Yi{Yec zFy!=YSWkEGVpp?Vw#cJR{aBgu{OWxad;9d4OYG9~yc$(&i`QgWIYXFBprhK08P-Xw zU|XNHt|rkYC(#D%1KPGq5^XtPaf~axyuXpJW#}UyWPpC56w-Rd0+db=~tIiyNUUua>|E>bGo<+ylivP%PucRL01>|SCDxKvV3b4OQSWjgw~!~v#nY! zZ2rv7B1=+Wjy)Z6cG2?C!Rt=C7xZGq;tz31Z3c*78kdJ ziILwiPwtVFU(2y}zIZ#i8(p1u|2RJIyr7?`KfkTw{s{@NV8}!&h{*3-N4rxA^ic~@*#?pE5kqmjtZsB|l{b|k*c7Rv@22$G!&FHQ&50ZR$eq?R8lnU=brwQd z0L2)VebGU#C`nBFBZeb4_gw3PBFD?#uM@A=Vo(=&qo`y&L^b-ornmTh51lAR2MUV* zx|3C%j+$>tpA`Ce>A%wNfRIDmS(qFYwf>Wp`f%;Tflpys>m6gdy#O6Ha|7k=Hf@)c z{uOB+L~PO+AJ5~ZFcY%bGbD%VYUq_R0IMYgYhpwfEr|Q23oV&*A(Fy&wAD}hZ^okM zlGJa>x4#4kn}U;go*Hio5CRLhaO6KffkYl@O(?Fg6T7~U^1)=D#5*W@3KF-4xsYG5= zc>HM$(kHD9Ayk+sDKISyr<9-JqK5VD{`8rN$ut`=y&p7f$`=T{%j|hpLtG0{ut^tf zn4lq7TZX%uN01cwb{|fPRD7ug-nn7OnW4Xki6P8Xg})S~GYHT*#Ao=36WrOkGAk)) zW8LyD2)#wwstJVzJ@C0i5U+mz=`)Ld*@v4mf$1|(t>aEAf{NR+V*u+iYWu_Ah}_N! zeA>U9Z~Cl7O1&>5NIcN-81VvXAjSj6k_H=zoi*5k61^1;L~%hG`jbMLz~$q+yPplM zH{EwG_LsX`f174{A?XDa0t02KHXbtEZ6r~jMl2RDEb~~B4rvNug<44G589$Hb4z0g zw89t?&mvU@(fZteF_E*AzgGum>Alp8)sv#aq?Cw6K(9l4$_TK0FGS08gmYj9V9(=? zwPg>mt%R zK<%VkQa_llG1Ys-OmyXnGdX{Y_&ZX6dJo*+t{#B%-xKY8Gx^D}Yq+?~L> zyk=O*?kJ0acD+`yk-g@Nckkk^t%)Z$%H%9d*sjB)o1H}DPHO1*0OPWn#)9MS@%B!o zuEfVrf5v$)oQEqVugLR38%ulJ6A{;nBG8={k1H%y*4&|w#SOS>dnQ)lx%9JShH)1Z z^TchqLI;MGf@yJDtJo1sSYIpY@f$xtKb9D4oqcNtiHXKaU*v0LzVNL_u+ZsOfO@!y!&d$=r)a0b=rBO z(J8-ri)+{RC3ud7av}nO{@WXW*@V2WY`f4((-U*kvB5-%0!JgMXU{oDC+K6+c}>?{ ziuI5q_pT{^T;?v0JI4zePq*V`b>hw!VK%)J2e#kAnBT!J`oJv-Je^UD?1h-B$R_J; z3e;Gv3f#A-w4o4**;I|y?~)>YjUB-r9Y6L!Ef8*RrAcs6TzIvg*LrNbqK)N0cgFIV z$x4uUNSAcp^ug;yc6$|9Rn(R3PLGfB3@hI91tlOk<&rdLPx@18jo7}K5?3e3y5bGv zS2aS|?6$|DJsGvS2gC5oE$2OmeK8?3F-mSf!~mI=)1a)2Yy>1WyEek>-WzFQfg?u`PNTow_~=^ zP%pqn`cksyjX6*LY8`pg0--~=AJdx`*&+Z)XjgZ1gZabl&Mk;=J6vFUq&rngN!V8$$?2j08B2LI-~)RYjUimSj)_O}R0 zU#$Cu*pT%ut?#I+f66KyV39YV{s?(y!Gs6IpQnVu8~L>#x9+Y!5k&Kg`rzxM$K?mh zHgAWxvw0EeVkNumbVj|rd&bbxK6VCcdZ#J-(5AF7y4z)NL-zAb-HBn^R1!~9 z59<6oDMx)WRwNzsL*C1BBKcBNX~;F&rxmU7VL7wt6k{c+8ky-BPC+NF7(H9qE+Z=- zE5HGD#cmf`ZuE^h$6xR->R$Q~HM87ia35#b|ImCA6a38g3jB4!r*L{;WJtC=JI4EPVwFc!RA zPd&~!I#ApuoxtL|;UJ*g(iO5?M~3#z3O~R9m>qwA`=CO;5+i@`*iE$99NZtxD=MMw zt?;YxeqacO8#7**SMJO2qDAihRGij&*OWCBTRXy@h?4mWOgOu}z1Z=5+QTFfgr3rL^W`29yd?Sp-d7GP(S5wS?|hU z1j9{=$Ijk;bFJ{Eaco+TWkexjft73@TN(zq>9QyVH_Rak)_H}|1(t!TxX~KJQ}s@0 z*`Qk`+;&-k7!$U7FQZhbhqt6p+@pr?dU7SC~bFmLDySJRRj)kcj8vdZ5x zI(@%%40u2TlLD_>0jk^9)E+={JLytYT8uWC<}b-{KiFw8@;HT*4mAFlX*jx8vU8H2#DpMluOh&z*5c@Z_m3-;89MH zDDoxjZp2kntK)xcE=rBk%X&hZXD~X3db10rQ#urdK5Sw(rt`MR8 zbloGHMM%qX2t8`$vt4g>r|RK9sK>tgR$Q2sarPItJnt3W$4vDOsv=WPQa;fD8zY~J zaK31fBjEdhgB=5Vjo$kE2o(s%qaqKukNWWiX$LmX_P2n|vC5ce_S{I3RX=#AEsI2Z z70O-z{mm`{>xb{PB(XySsQES=#5v>{ zA?8@lmqqAhZ) zetf-Um?QORkERu}PdkqvHvop8I`K#^84eKO;{`;g8^8$?tqV0~>Q#Wfp7DlEjgf4>2vapNE_`t->C`W3Sx~Luna;5j z;;lGJb^7@RmML|-;yLA+;G7Pl`qrEyy&!5TN(`(duVT4_*(2=7(Bcb5m^wQoGY|b7=-#`(Rz7f6GWDv39R;=reWrYNqaP6%bp~ z^pTsZBjDFwg1$EDk0>t30X%E*$`5O+95%o3NFWLmv{&s0)nTlfPswwD0g3r=D-8YI z$@hGWdB|A6BIEvXZYI+}q|FvNW$tSIz*`HzVZ*AyWwi2-!>L4KlD6|5D}Nuo8M3>) z159P=WtCrkG|71fmtVg{^6n{Z!wV

_vWy9Sg3vcNiSp9ww>Y9b^HMEs#S61IB6FIl)k#)mRf=p^&T1ze%C+X9W1fA?x=4uMSy1_&VlLSZfQ=h@Lm0V7>V^+(utGX~I@V@?a}Zc%;lzz3jQO*Ax=Oakwq)o?<`?Drh}wdPnsV6XEQ{ zn?X0^O@TX(IXKog5a{Y6fMs<;(vNxcp95 z43{6qHp!=)$B6qGfXy_dd-Fsj}Y3JdrZD3&FCQtC0VI&C3kE4>b z7(;CxA%ZVNI~ITg?tE|pm!BRobyWCNvdB0Eg0BAJH`?Rf)T6yep^_u@qGDX1>7P0F3up8a9j>mQL4N697seLqCeA*z3p8k4bfFX?jMiv z*@D2u!Iv&hSRU`(fB)LiMopCa7z2akGlE2<@Hw9N%)NL_9yu52u8paWh&jpd7^puT z-Nd|PjL_7c#OuMUHjWH#H)j8q){a3jBMo#t-gG`*>7vyf(*G@x>Msf%bgXHD3bsO* z&0WNxk5-mh%PiOsPJc}l1v?i+&FMY?w8ld8p>KgG63;2xp!rzaW%xrJZ3fgTbaN1=sSDxqiJh#PNa2z;v#RHN9 z&7h`>*Z0zPy_R;pFk=+k(1bYQYUPHq(3d>bjf2JkFWkPM$Ni;XV zJ{q! z(rj$1PMqAb!<_yu!NRPGL8-yB7r@R+^a8EUs`cNh;K}|yYVtlek1#J;SbD80ode6( zISs36=m?b2<*idx<2M2&#Ty)YRYQZ`-JM1++=S?nd-8T+ds-I!GC6+r*c6TM-5O1< zzd~$L1Lwcy#D*YVqw${7p)8wLyOX(?1&8M^tkB(S)tTSP^i7~))hrH3tpMB8LlYhm z=Y)34P-@EG+x>VGG13XQQA>2Z(e3v0Z*Ce`tWw`7^ivW3;5tGLT&JfC+bjIqAAV2& zqgHRBAM*`O$am~71B(%lB9G)lmkoBpl476TepVGDoY?`2?KT=6ksREYVS(zhDw8uOzes+rhCSGoFJ#-W;Tnb!-p2@;T z{B8@66%AU`HPe5;gIUBP4kU!y$kvgKWQVT*4D8C4!L+BI^FTU1ptvr4LdpO(sAmY` zW!R%f`;nT&h5yLSUnoTNPDl*u`{-^MojyvAwL0*~b@`!`Ig_u%9h&zd;=X3b*Dp${ z`I|fRPr{Abo2NzB9bv}fmH}%MQ3=2s0Fe=vTrKOfWSex)z0p(XZd=&5IQ*MTPF+Kd zmXyfXNkQ{fZ1bTHz|jkNFv_i^5Nreb6-Ll(85;RMtlC&w1Yc-Dp22B$j?xmjaNz}h zuB!bjhvU!Qi6H5~%`Gz+B=)TL51Lb6Ic_4?Dz|H8*MXGNEBD2>5!VH)t~E1hSBq@n z9%X7Gdj``UM^b*G0NQ_*A*KJ?F)_1XUio=EYud>kC&uMxC}}ptF(_yyvtv|-xIaD( zRi=&%){X_zVT8$TrN!fukOKr(L-x(6Tqr5vgmopQ=xF%Opg_PRi+AE>UD9O%3!THP zSL>dbHJrj*2DMI3@wp~$*{K|HV0xiaJ?MD8G`WhFoLo%1?R?gPxuBroo|)N9!ubCF zkJ7qOYOC#d)i!Ts&tUS)_2UqJxqjU7mTRR)pq$g2LCqvM3R?VRCu#6n!o-dD8n+?{Rx)x!-b8m z8Un%7z@d_*Rzrfn0G~fq5fW;rFb`wbfYI#jOxA1KFR0}v;$xYur>Ni3jFTmh<@w=N_xr=4;H#pM-p@jcJKOwK_&f zD%K&jhIK$izw!LdtPdzMjaEt4@9okHw~8-3W2#H;!xaeG@4Lk`cSc%Z|1+I=q|L4u z)at;y=J|l!C;sc@bt>QZxA+{m=$hZzu}s@KU00=(o>nC++ozBw6^qSnnS9~z5zw>XTWUJ*oAf9{l=`G(3w^x39&G`p_|&;ZtmtqrO)(*#ZTvg(b@TX zE>A~y1l^_0mM1c^^}K9=xq~HAQ)z+I4a4EZ4&ES{;BRBiAac~Zo)f`i@4=5)pV_4( z0rVXSCZ!!;?HJ?t9pW~=t*8RK>@*JI8qMBP&4PP5gBIfLzIqp;XQP&;nd+$b^O&w6 z-Y}3TCY;N`TAalo)v&l#8tT4%Z&cHK9E(X|_4hsW=cX_!fAqA={{GA2qri|lR_KlB zvqpSEy-%SsB;i5{#+0un=9_X)Ptb&E0b7;zQ$-wVHwBM*F3##}Zy{7TM<J(Y4&4*^!vYXKbS;^;)H*NGo{m6Mg~@sv%|lG=nIMzeiUZFNvEmI^e%uc zz80X;vAcKmjzWOome$^4=0dCP8NH(Rz)}};s$7$oW9x7Aq>gaM0s!Uz?2;up-8Da;HnnTiM^Q6PWVF?JmJ7(@A@>H3vf7F8Bi zPOu&-;(4HfN7?$3nIPt2tI7$e~_K znBTXyCQyb5J$A6*5l`I%(b{ZrW1u7_2eTUrr-2n+?pVqc z6sKLj`e~_rhQ|17h<7W?cHYz*j*?X?-#*O2WJonC18GY#}>y|9lppFUu}x1{rm08 z#l)zx4TmY^Byu9f;(;o{xysOuZ$s}Ai66>_rZSjb;-;h=UE~yaO*7#;RzK5YAoB~A z82OGAIPQ>VI2PL=6FG^)+zd|d-@Bi0I3$Z~u`JCrSYsiS(U8jwBrVcJJg$l%y@~8!KBXbqWhasL4uj39u0<{GxsizyefYD_PM$~-S0L_JrUt96!PE9=t!^JWBW-t9i<$U_+}nXvSRd@n zy{b{U`~)<{&vt%d554wWrn#wx8u9fZ#myR$Hgaa1M0b{A12f@-jjrVo_jJK{3{f&> zfXdqhd3L#Os|5G{c|$fUvbUvmlME#Fwsk1k!?hY0#PS<&7)(W3jP-q~B0bU0?aEi@ zcHh8$ZLhvGtLAU`mj1f|%F0T*jbgjk*37I#&TAmTZY~t1+~l3CDf2s>=qRe880-~) z!TjBpHR}gV*b9jt&r8FDzT@_LF5Z?V4Mn8}hc=u95K%&vc(u08tZX)pYHTiH^zHJ~ z{%WtZkg+xO2DNmfq#{e%BX&R4hHYhSZEap<<>bx}9FE>sU_Z~6n#u+NKaUSz)3DzDR;mj~&A;hN6}WwuZV1pAl|?fz{d7`r?(+kX1P+Y+>= zwr)P|b^xq28-1@Lb|8Z&qPofj|EGYoI)tjSIS!oll9nP04H(=6LfGlZUu#z8^IiIARI<$FsanB0afa0?sK7{I) zzcBb!3*zpEbV+ehxmH5)eWHD=JLx-3JBh@pPH|5uD$#CH7BL>tk5I0W#Mj*E`oOV( z;IiW|EQ;(eptYccND}=D%2S%=+t0mJzyIVNP4>5=)BH}X?RMNfw;eyZ?1f^P7EI0M zQo!VM(0Fmz%jH_wOM?F-l?|f*K9_1MDZQ3>llfg|*GGFhGmEYo3x}JUaSOvA+aDmL zCM5fUZ*WkXKApHEwxlQ_48*$m;)~~Cy{@3-k8#_eb-Uc~eF^RAW!s1nqMb21tY2Ya zIFSz;BD+THjjh~(ADUl2i-&W)Pw^B4oj!fG{n=)pG4YL4Psu$udg2>qYc>jXx&1ww z9XGbjwlRTFz5JDIY0m4`Fzg=2fZG|!ZSG4~UdpbC6*e*J4)UO885GJO@o}NP7>N{gi3u+{M$Oiptz_S1D&j5U#a=5KV9J38=&uC~$rjljgY_jk#zZ;4vW$^tsH&D#MPtbNtP4?K*frkE<$g4PSa( z&7+f-imhmRs1LY zEQMYUhW7gp>O}9lF34s`epT)uo@0$jstKc*NtX@w>z=zUA%K1CN?N~S1b8|XPp8zTU5JHgzY$r zz*D;-R9Tv=YHr*78oHJtHvTj-(IaG<7d>x$=oln1ErVof^?Y}ygC$FqemOOEEfnW1 zSA`GUKfN~T5QuLBh0iyzH3cnEz;6*>E}O}Hg|Kv~@as<`Ktvt366YcuS(Nxc9y4xV z|5ri#UyuRTzRy**#n5}Y6yBhGWc29n4N(8WT~)~f^bH(kWgm@(WLh!5FAOB#wX#1l z*(s;%SHmo$hapuxL}wbr?Ju^>y6_+GAJgDaT!~m7|4-eGVZxAzw6Uf>N#1ZWT+Pcc zYa@w+YGbEJvSxJYfVgx)YXJTHqS39m;DSNOyDgplsK0YGe$V6O%1znzN!$^T7&Y~r z0>({Ivdb;n5*`&nuDd`@NuV@hi=}q@h9{%yc?LnGOmDx%NR`k%gz68X;ii5=KWcLh zCWP0Fq{FJsY>3}+edmPyDe-f+-JAEjm*pzJ{6}+ZY0CsFOLgd{>*&r^b|AjAzEGXg7M!^L>7@=Hs z%qrEy*dP-6!Pb_5mkO*9d=h1;^Xyu4hwa+uYDVb~Lgpap5@wXIp`;hf+v8EU6m)eU zA#d$HCedOLxner*ItmG;dKEpXN)Y77ZE^NJKQWfql-L4e@Fj17Y`3WEe#^r{>||0{Zf;d(J6Lo zeY4GG*a{QFSZnxJ3WwV-L1zx~TbqkhwS%}Z*Wr!yxYiJ(k*ikewT~hEi#mYT*Iw80 zjn}ss@=Wu;8yB_JZ^nEF#rHiad-yC*vGuHOD@@hR`S(dp$X_Q}X(e+Ee+uRdQa?-i z0@wCOT7^RaTX()Z+q;>lO(C0qy~_=~vtdj9a@KBms;3Obace{svBIb&$eD~!KD;s} zhfDcu8d_5@y0rTDkkh8l>lh)FGp=21P9Qi=6|K7RUKL-?4j$?^(&wF05U1cZ@77I( z&KbqpgY(e8J&=Vjl&{qe*fKmNJzS}q!S0~v2;hqzWjcq`^VRzfTi6+Y>rLIGQ^1M0 zNZQ0df5-C`3_o;kdpdzLUwT|%{hxmwQ(O^$wf^B14`EiVc%rVinG{W65LF#UG2w`9 zF*?nQ+J#E{`QE-N7EiQ%`aFZ-ayFmYfeiwWzrM6Yd7_{5+r`@!6?w^sQWtk2B!GDx z$-u?k%F@zO6(8<1;`%=oY}9^XnDe*_y#eDblYw3Q=I~ z1P?HG^4h$Kea3Zkf0%*m8H1uQ=)&7PLX{39P2n-2GEK=6B z<_U^Xf)_M1&#WB5`OS zYl91^XVx)BcNy6J_AvLIc^pUi_>A~;;IgaCh1?zdsD$O{(W^X6jy)62n80ek-;erSLVQ zvRv%$$4y}-bqCUIvszfyCvssb=6Z=N1upa&6g+aevNUzJG-YW9N_O^mrR^o+>V`GM z6}{4LdT6Wehx?XMUh6Y%;2T^8kc@|`Gx>LXn&RLJNAe1{-D8{MUjS=WxbOUGvy0jS z*;}c1xm7n8P}=c~1E&Up%cx_zoZC$QLb0M&AG<%paDj|MA{)P+G48hY)qy{RbDrP) zx(;^_kvyP>0n3Iv4?;KC;mKCV+yxv(;`}5lcg8@1&OQ1~Q*$7z1~}&4`+4P4gY$VT zd*C7Bw*6HiRZf}eG0>QHGPkmN{|B|r&I|QF6w>4rX+l>xnYNa=~|~nSnZ~?(lIZM0{X_77;tAz#XT)D+ ze6XH<9_9z27x6hTSTL*0ZA`zxuJ%5S(;<-9RHhD8*y1jTvR)!9vHQIB*;db^Y?j#- z4}neYd6fShKovu=by>6G)i~nUFqf3pi5xf^1q;>Ur_nE;%m+A~en%f}5w+XY{Qc{MJmsznNN$T5r*K5RT6Xtj>`jDe5_-TEa6E;> zUv{wAuX3+zQXA-n(J$CfONfkFm+)A{-)O0p>bhaQ*J>x!zmw|>k5o7%)0}kPz9zy9 zRw)H=cU?c-_I(iJxM6K)IC!o%a>((O!bG^^wf`p3#fR;r2l?u687dvopu2X=TGpknq z(3fF!yi8Z2*Se-Et3M}y*%KEkOOfSDbw;YBGR$0eyzEc@2hza`d}sQpa(9#f3BxvE zx31w3gB{`I^T>C7aW|NPz4H{+T{SOJYe9MUjsb7SpZ4Qs7VkW6+Z_8JUI4C1rP<35 zRDj+b3gV|bQ@oQ|^mcpRK1F-9`Wd;?8tp*-jWagAV`SBI6rLP$r(gSc!r^qA4s~~h zSbB|u^I!K(SJhX{+Nsh?jj;1ok=TH`JeUc=4k_DqCX?QEnV|M)5RPD-Gor|vcjS*w z6FE|LD08_qS?z%R$O{MuQ&=H|7u$j8fBUJ0+|Rf>d8?VG#CT>Z`@Mt;VvDu;@gGFf<${0zE||F_S95*3%*HW zzMJmuV&q0ASSnQH+~W$^SamB89(&sAyYeohl53BTO2XW?P2?_Z!Wg!cq?bUNQp0X* z=cR0y6yte{DecpdVvi%TYgUl60#;?_YM)}V7C&JmvO6!X^HG-aUu}NV;Gf$}h&zon( z-@s40rN1~SO!|b%0)zA&THb@0h%x3{yAku zlTF|$$~ckfYkt#cQCshh;MePa(0e3L<>;Q|c6w{bU=c>~ zan|m6&pqD*X=<;?OJ44f%C`Y9)PaB9l(Jd8dQS>>z{*gGGEJz$st~a1)C(*qdar#m zA2=4ALqSV054u%IbaJy0)bXb)5T3zNS`Mb~I>m8Y(7&_KjE>I)Qx&pN9R#-d2(S&_%=JiM8@d~U0wKDYd-H`WH&9rUS-IhM z+T~gB+R+Ea(ou4YqOP-Nbq;S5NSWyKX|kZr;z25y8;i4EXlrpivw4xB zpGxuQ4s`V;8p^k)Bvp?E9x!Y5yjE1F-St?l#9vP5`G_aii6NG&b?(J+BWh%|0+bjn4$W5-eN4#P-0>MpzY7c1f3(Fx8n|=HuPN z1ibx5G@3rFXQcfZZ9qJazo8O))kF>GLs|7!o|t6Eqd^*Z@Cz*H9)1w*y}|PD_wK{X zDOCjf=8D^%(zk;46Or+!v+3LSPXh}#HW$KH-T=+*!VSZdsoTh@)EOds#rvy;;$u7b z9Ijq545az;j%Q?A$=hy#nkp zc9#Txc9+k~CaW%Md9p(PFmE%BNA9v1`x5HYljrT*_aWPc!TL{-n6Y=!*V>uKwiR{2rYU+royM*%@mSt)WgXeRE<#@lT>Kk&ybR>`%{B@ zDVFOds%%LR?# zx3>*mG(J6JJvQB!2aH+6Ndgi#4YIOsA3+=Q;jt-{#zC z(5XGM--@sot6w#cs7$ii#Dc}4k0<%}ZBvC0d?fw_&JiO4WO6^O3Z?~zJ5p8%2il)` zcl9{!!5sfyU)XdYyN-c2u`|beu+(f22i7K*Llil1#r46yf8?=H1hC7&|@7Yd*! z>L~y0nu*if4{3$DP8#Iit(B%`mQD~9{6XI&QJ3WXg%MBc{`1R7c!-t%`%Dkgjb8VB z@{t_y(#0u|KjlfsWRruh}h#xiN1!PE^2ZUN!B(r-?@ zCJDBS7|9&kXy&a>#aW~fu6yt#ME_7B_?~g`a6<(3@ZJX8etox;c2 zruqlx4o5+=3*W7-CYWEzc(08?*B;lBK_gkZAlJh~4`C}`IQ~XcM&aAHx^dD9#r!V? zVct9~+T%7+lA6HYRSK6oPn4iBs8VxVJrWqZed`QGfkgYmv4*Z6iQGvp#co?`M|^0b zJktTI38juGpMO_6oZMsT7$Oq`Riu*^Q|Fi;} zut;dYMR?I!xPy(b$-#5~a6x(oy_Jioj{p08GiLL@Y*|5yKuU_KNQNpb?yD4IdCYJz zD+^({j?NWU%q<7miupG_%aQfk0M(DIciyCO{kkQ^;b{sdl zpGWuhr}jQtN09&xDhf49ri(5)B9(|vKH8!Ff2R~$p zvA$rt^IVCs3|x~ly74{Q3~r^8Wob9CYw5Yq*>k057sF>GELlO{1TfmdNRum;3hMmI z+@6LpE_a{B(gkcYl6Ad?CA#v2-n} zZ$)I%$&y99A#%9!3_M@B%Lc+GIG*>@_w4@BUKnYv)c#2c5~AJjT% zHVfe3yRx9i;Y!suAx0w0(nQy0Ir>Zen=A8>oVZ=Bs~<*2V5t-tV$GOl)#O`PMd)!* zmq#XusqQF7Xp!ShwZGAqZ_{O|xWUmkalnk$0$X-lg;GzHR{%w>A4U64)D)5H+9z)8 z60(xKoFIRoGHGE=xMK|><1MD2?NJ*Jx1V;tc(JvRyVidw>XhUfEbvQ28qYhZGTS=G z+UMt0c`B~)Zo^@=JI7H`eNM5niRBcT60_Ltgc2uJjgE+F2E0S@%9_&e$=Ge2_f=5F z&D6l)GB8B8KSA5(7``wm*1*qp_rwXNUl&KN<^X^V!OjT9t;$0XV~*_NTFfok`1<)= zja7p@k##j%Gwl zhSKP5@bcjx<_5|$!+t8`r$$&b!K+1}=u~nfr0M;h(bhZGkdY8a2l5+hh}@_S=UJta z7d7F;K-tI}KUa1YQnjAmUH-S&re#>;Ap!9>!P6zfs<+#hrw`^&Zy&D{b+NkzY=Gf^ zt*KV^&|Px^A6jr|-u011Z$!Q*dle13VYqesooMGkxV~}tqB+aFzs^|0#4XzQ6@92T$+{RG+fMUa zujqq&Wqa8+!k?C*G^Ay`0_Ck zS`D;IDRY*Mtpx;GvXTQ+3 zAmQvmwwfW@k_0Z}wmM+1`>ui;!F{wEC@N$_F)jKaEMGA}_x`xXHVhAdN+WE1Y9|yQ zj>d1nSDwV7u%}d!Cq!1`D7;$#*Swy&i2nuf`bkIRzRBZ~9P>$@ct`c`^umYxNMmfs z7=#y}ZEGp(0Y5|ldp&c9HK}8C!t814Arj*o|F*sKiGzC(0{v13jl-`5FTZQTxf6GN zv zNn|q07XvKs`3sKknkOyyH6&Wx>*`{gq^bQvPunw(nkS4ab!0%_koa3Q@E85h0ctAN zo(|222m8&Y=K{Scf5PSp_h|3zsI+G-c#G%{C$a?7dY|egJOPjtrT-(IAt(lGfKldr zqkZy*?utB6j7h36>bq-^Y54yHwF^r0zcG>j<=J#iSD_wrO${p*x3XT^T-xvt@8h(8 zZPoL3^sj#b00960>{w4vf7>t=H!ZD(7*i*06WS>UCO|?faAGIYF{TX-tpc`d=eACp zk=mK#v=r@tw9AhBBHZ~1JMOUK_zwFBvx!685J>umKZ95@=9lLE{NBs+v;A@afP1`; z@jfm`(I$A;fZw+DKO2X?Hx8fc9)6*ZpNs|l0ss4k_q^npk`g(IfAf;l=M{L``}a7b z{Pu-+fd!wf@QsJ~#Jj5sUqRyaJ)2Obb%{&0I%H5Y2-O;txVC1YHnKE`q1AOvMe<<^2BIZ@?$Z^f4Bo?Cu9rh7gW_<@XfV4x8v12l1$Kh+zyRH!44@#PH-oJOY=f2`wpKR^;;$ z^5@6@+2+k()|2?fk8@A23?Mk!cQ{XOly-P+W@PJ_N|_<`)O*IG@80<9n;wpXC|*_1 z3HjV>kB5|>yO!_$|HRkj?-LFP_6e0Q%DyK(_Ida%W{C2wf8Z4|plh)*CH5w?2g{2P zchBUdB>RSnui6g3seHa3gUZF_<$Op^VB4))W^FX`dW?J_Brp0J!Hn`fTWj%yK?BjD z;{ISgaok7os&OTFr+r@VcQrf;z9WS%h^rv}E{d-~*By}KDB}HRwm<#VxD4wbo-gl3 zz_F0~lJe=+uyLw*(5F`g~zbIteF0 z_>BNFakiYd9lJF*TO)X>vIZ@y3TwNw3uj(iXt<^reS-P&wt1>HQ?D@HH>cL+~tz^bq*9NqI8&u6i|@+ntk3U>j1C`#ZP*wh(KQ zx)aQof1XqC*g3V2{d&-K)d9gd^{V6f0Q8r)EIz@kViu)mXfwxfGL>;X~>fT**xO_E})+s>pcu(sT-aKiY zqUXUi)+s1z-_bh7R}if0n^LDx^Kg`3pN8}he^};os2R!y?=-t#{dx2s00030|Lj;# zPt-sZA9mS|9MCmUL%g^L3`;^>w9lzUk(6p!@hc?i;q6%z8H6v zf1CE-ar??U_w&w^TqJ(!kUuK%djt3xiC?f0B>-F{UM0joy*~dGkNh*J{GQ(ZHNE>t z5qLro>lP0E_EM7D?~|JcUcYlZApSkbNYCCodi(VZvhTjfK7nV^nugYku&8Q=$%+`Q zAzWzT7x?sqVse=#)KBE(u_9xl7`!oGv-&w`B%wDvg6U%3E( z-I4s|4tKpMdSpF%WC2yxGv%FR_jm{|2fW{v<4Hq<7$l9~<3p@pxsbf?rX6Aob}bJ- zIGlufDxP_7Tg>}g3F~xP=dXI5{|MT3UX~YR-#w3g0#6Z!3 z2O-%2{&!<5=4vo4WcbYd_ zAo@8pZoF=Scy+hieFk0)f3IVo!L>W>GhF^Y!)K8887@nm{vYf67m)TD(msQiA9p`_ zV`(f|oX;sg7gxS6uKaa=|4%65yQh7Hp!nWDr@lfn?JFeeE0iv2Utv4Mo;jaiIX=Cw zz$?Iug{gS01>owVgy?e>`U~5jo!=MHU-$q zXSn2!kowNfOftK6?al5&sK`iyiHL zG4oQ2%}WV!SIy`1qRYN+i;Z8GR)1Jp{kyLCg+@tPkLK;NWp^fFw~XTRF8Ogad{VNW z-Pds^?G20bKq5|QuNt-A>#BcLH<1^y-|t!a(h$9!-z0dLf6-j_3ia&KaBk+j*E~+cR-w)nz%?ys*uvQ;hxrdiK70 z84d2Mjv7Y$YF0lx26z>45^ze-#aY06fDZsoz*WEvz$bv)00LMAa6kz76!1CVOSJR7 zk@0OD%=RAg3INW&g%7WKf^s()cq!5Le=G0K{$b63e*$1f&~!xJ?DM}0%;hf0dS5fuAz$2E_5Xt2p10}JXnjeK zidgR+8a?l4P<-AcpMPh$g9Tn@4u$s!y0-ige}=j?uZb6U{kH@O#Io>1SMgdut-o^# zf9JCKiw=dX_eNExPw&aSIqUm)k@x1J@;84sdoE8Nh22{}yWdd#chA}V+x)&Yq2fm; zbbq|C`_VVrr?l4?6Q`ZuG*Ww~`O>vF|M=@n!+4I_X~Y;nthli4mlBvgr7PxYtR* zStx&K80#r180%@ihkfioh5DFwL@z}qe{n&IOtuA=30>)l@h%dA@h;;>YvO za(~33;K}!uVY&*6*L}%d?)UAG^Y}0B|0-K`(`Sw6DF6Tf|NrA-U|=u+Vm2V=lj&xf I1R&IkkDPAG-v9sr From 52b9122b4f014416b10d982a4e3efe17b3ada5aa Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 4 Nov 2019 08:24:08 +0100 Subject: [PATCH 50/55] clear release checklist --- doc/PsPM_release_checklist.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/PsPM_release_checklist.md b/doc/PsPM_release_checklist.md index 2ab216039..5520506ec 100644 --- a/doc/PsPM_release_checklist.md +++ b/doc/PsPM_release_checklist.md @@ -5,13 +5,13 @@ any revisions (commits) that implement/fix something new in the release branch, don't merge these branches back to trunk. Therefore, it is sensible to create the release branch after making absolutely sure that no new stuff will be implemented. -- [x] Update version number & date in - - [x] `pspm_msg` - - [x] `pspm_quit` +- [ ] Update version number & date in + - [ ] `pspm_msg` + - [ ] `pspm_quit` - [ ] `pspm.fig`: Load `pspm.fig` into MATLAB, update `fig.Children(9).String` and save back to `pspm.fig` - - [x] Manual and Developers Guide: front pages -- [x] Make sure both manuals are updated -- [x] Add release notes section of the new version to manual (at the end) + - [ ] Manual and Developers Guide: front pages +- [ ] Make sure both manuals are updated +- [ ] Add release notes section of the new version to manual (at the end) - [ ] Get the manual reviewed - [ ] Create manual and dev guide PDFs using `lyx` - [ ] Check if underscores and dashes are visible in newly added manual sections From 1b42ca03fc3037d06090f9dd70ca01cc57b2c8b1 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 4 Nov 2019 08:36:51 +0100 Subject: [PATCH 51/55] Eshref review --- doc/PsPM_Developers_Guide.lyx | 4 ++-- doc/PsPM_Manual.lyx | 4 ++-- src/pspm_msg.txt | 2 +- src/pspm_quit.m | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/PsPM_Developers_Guide.lyx b/doc/PsPM_Developers_Guide.lyx index 1f0d351ef..ff6c21df9 100644 --- a/doc/PsPM_Developers_Guide.lyx +++ b/doc/PsPM_Developers_Guide.lyx @@ -145,8 +145,8 @@ literal "false" \size larger Dominik R Bach, Giuseppe Castegnetti, Laure Ciernik, Samuel Gerster, Saurabh - Khemka, Christoph Korn, Tobias Moser, Philipp C Paulus, Matthias Staib, - Eshref Yozdemir, Ivan Rojkov and collaborators + Khemka, Christoph Korn, Tobias Moser, Philipp C Paulus, Ivan Rojkov, Matthias + Staib, Eshref Yozdemir and collaborators \size default \begin_inset Newline newline diff --git a/doc/PsPM_Manual.lyx b/doc/PsPM_Manual.lyx index 6ab8564da..54c6df449 100644 --- a/doc/PsPM_Manual.lyx +++ b/doc/PsPM_Manual.lyx @@ -150,8 +150,8 @@ literal "false" \size larger Dominik R Bach, Giuseppe Castegnetti, Laure Ciernik, Samuel Gerster, Saurabh - Khemka, Christoph Korn, Tobias Moser, Philipp C Paulus, Matthias Staib, - Eshref Yozdemir, Ivan Rojkov and collaborators + Khemka, Christoph Korn, Tobias Moser, Philipp C Paulus, Ivan Rojkov, Matthias + Staib, Eshref Yozdemir and collaborators \size default \begin_inset Newline newline diff --git a/src/pspm_msg.txt b/src/pspm_msg.txt index 623e22a15..00b3cbc61 100644 --- a/src/pspm_msg.txt +++ b/src/pspm_msg.txt @@ -1,7 +1,7 @@ $___________________________________________________________________________ Welcome to PsPM - PsychoPhysiological Modelling (incorporating SCRalyze) -Version 4.2.1 (17.06.2019) +Version 4.2.1 (04.11.2019) $ ------------------------------------------ (c) 2008-2019 diff --git a/src/pspm_quit.m b/src/pspm_quit.m index 2caeb02e0..efd6bbca5 100644 --- a/src/pspm_quit.m +++ b/src/pspm_quit.m @@ -33,6 +33,6 @@ disp(' '); disp('Thanks for using PsPM.'); disp('_____________________________________________________________________________________________'); -disp('PsPM 4.2.0 (c) 2008-2019 Dominik R. Bach'); +disp('PsPM 4.2.1 (c) 2008-2019 Dominik R. Bach'); disp('University of Zurich, CH -- University College London, UK'); From bba48bd19e39ecbe578b19a53e1693f7a9ddfba0 Mon Sep 17 00:00:00 2001 From: Ivan Rojkov Date: Mon, 4 Nov 2019 09:06:34 +0100 Subject: [PATCH 52/55] Forgot to change release_notes.tex --- doc/PsPM_Manual.lyx | 12 +---------- doc/release_notes.tex | 46 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/doc/PsPM_Manual.lyx b/doc/PsPM_Manual.lyx index 54c6df449..65cc8ff5b 100644 --- a/doc/PsPM_Manual.lyx +++ b/doc/PsPM_Manual.lyx @@ -18788,17 +18788,7 @@ pspm_ecg_editor \begin_layout Itemize Treatment of missing data in DCM is now the same regardless of whether they - are specified as NaN or via model.missing -\end_layout - -\begin_layout Itemize -Nonlinear SCR model (DCM) now does not use the inter-trial interval duration - value (ITI) of the last trial when computing session specific minimum ITI - values. - Previously, using these last ITI values would lead to abnormally small - overall min ITI values in some input files, thereby causing the inference - and PCA sections to use less data for all trials. - Now, we prevent this from happening. + are specified as NaN or via model.missing. \end_layout \begin_layout Itemize diff --git a/doc/release_notes.tex b/doc/release_notes.tex index ae0a56947..a9934cc85 100644 --- a/doc/release_notes.tex +++ b/doc/release_notes.tex @@ -65,7 +65,7 @@ framexleftmargin=1pt, frame=l} \renewcommand{\lstlistingname}{Listing} -\title{PsPM 4.2.0 Release notes} +\title{PsPM 4.2.1 Release notes} \begin{document} \maketitle @@ -528,6 +528,50 @@ \subsection*{Improvements} variable to choose what to do with the new channel. \end{itemize} +\section{PsPM Version 4.2.1} + +\subsection*{New Functions} +\begin{itemize} +\item Three new tests (pspm\_hb2hp\_test.m, pspm\_filtfilt\_test.m, pspm\_butter\_test.m) +\end{itemize} + +\subsection*{Changes} +\begin{itemize} +\item \texttt{pspm\_display} and \texttt{pspm\_ecg\_editor} do not perform +filtering anymore. +\item Treatment of missing data in DCM is now the same regardless of whether +they are specified as NaN or via model.missing +\item Eyelink import parameter blink/saccade edge discard factor default +value has been set to 0. This means no extra samples are discarded +around blinks/saccades. +\end{itemize} + +\subsection*{Bugfixes} +\begin{itemize} +\item Fix a bug in \texttt{pspm\_hb2hp} where the function crashed when +there is no heartbeat left after lower and upper bound filtering of +the heartbeat periods +\item Fix a bug in \texttt{import\_eyelink} which imported more markers +than the number of markers in the actual .asc file +\item Fix a bug in \texttt{pspm\_display} which crashed when trying to plot +ECG signal that contains NaN +\item Fix a bug in \texttt{pspm\_prepdata} which returned only NaN when +input signal contained some NaN values +\item Fix a bug in \texttt{pspm\_version} which crashed when MATLAB was +invoked with \texttt{-nojvm} +\item Fix a bug in \texttt{pspm\_get\_viewpoint} which returned '+,=,+' +lines in the marker list and which crashed when given a viewpoint +data file containing multiple sessions separated with '+,=' type of +markers +\item Fix a bug in \texttt{import\_viewpoint} which created a new session +for every marker containing a '+' somewhere, e.g.: 'CS+' +\item Fix a bug in \texttt{pspm\_get\_events} which was not able to locate +a marker if it occured on the first or last sample in a given datafile +\item Fix a bug in \texttt{pspm\_filtfilt} which crashed when the filter +parameters were of dimension one +\end{itemize} + + \section{References} \bibliographystyle{pnas2009} From 7f9c8072c3ddd4eadd7f1fd8f929d2cb24d90e1b Mon Sep 17 00:00:00 2001 From: Eshref Yozdemir Date: Mon, 4 Nov 2019 10:42:50 +0100 Subject: [PATCH 53/55] Make sure there is a + marker in sess begin markers in import_viewpoint --- src/Import/viewpoint/import_viewpoint.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Import/viewpoint/import_viewpoint.m b/src/Import/viewpoint/import_viewpoint.m index daadec1c6..e9ac03bca 100644 --- a/src/Import/viewpoint/import_viewpoint.m +++ b/src/Import/viewpoint/import_viewpoint.m @@ -54,7 +54,7 @@ idx = marker_indices(i); marker_str = marker{idx}; char_eq = (marker_str == '+') + (marker_str == '=') + (marker_str == ','); - if sum(char_eq) == numel(marker_str) + if sum(char_eq) == numel(marker_str) && sum(marker_str == '+') > 0 sess_beg_indices(end + 1) = idx; end end From c3c52d45c000d1241c8fa41dbf475d6b82bd4066 Mon Sep 17 00:00:00 2001 From: Eshref Yozdemir Date: Mon, 4 Nov 2019 10:44:30 +0100 Subject: [PATCH 54/55] Remove all NaN signal test from pspm_glm tests It doesn't make any sense to perform such a test anyways; what do we expect to infer from an all NaN signal as input? --- test/pspm_glm_test.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/pspm_glm_test.m b/test/pspm_glm_test.m index a0368f12d..7a8aea7e1 100644 --- a/test/pspm_glm_test.m +++ b/test/pspm_glm_test.m @@ -8,8 +8,8 @@ properties (TestParameter) shiftbf = {0, 5}; norm = {0, 1}; - cutoff = {0, .5, 1}; - nan_percent = {0,.25,.5,.75,1}; + cutoff = {0, .5, .95}; + nan_percent = {0,.25,.5,.75,.95}; end; methods (Test) From de74a361022ccf0b4be3d9bf74c589bbe62c6dcf Mon Sep 17 00:00:00 2001 From: Eshref Yozdemir Date: Mon, 4 Nov 2019 10:46:08 +0100 Subject: [PATCH 55/55] Extend get_events bugfix according to the previously implemented tests --- src/pspm_get_events.m | 13 ++++++++++--- test/pspm_get_events_test.m | 5 +++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/pspm_get_events.m b/src/pspm_get_events.m index 8000bfb15..13411ec06 100644 --- a/src/pspm_get_events.m +++ b/src/pspm_get_events.m @@ -44,6 +44,13 @@ data = data'; end + possible_values = unique(data); + min_values_indices = data == min(possible_values); + max_values_indices = data == max(possible_values); + data_orig = data; + data = (data + min(possible_values)) / (max(possible_values) - min(possible_values)); + data(min_values_indices) = 0; + data(max_values_indices) = 1; % add more data in order to prevent deleting values with diff data = [0; 0; 0; data; 0; 0; NaN;]; % store information about finite and infinite in vector @@ -97,9 +104,9 @@ if ~isfield(import, 'markerinfo') && ~isempty(import.data) % determine baseline - v = unique(data(~isnan(data))); + v = unique(data_orig(~isnan(data_orig))); for i=1:numel(v) - v(i,2) = numel(find(data == v(i,1))); + v(i,2) = numel(find(data_orig == v(i,1))); end % ascending sorting: most frequent value is at the end of this @@ -108,7 +115,7 @@ baseline = v(end, 1); % we are interested in the delta -> remove "baseline offset" - values = data(round(mPos)) - baseline; + values = data_orig(round(mPos) - 3) - baseline; import.markerinfo.value = values; % prepare values to convert them into strings diff --git a/test/pspm_get_events_test.m b/test/pspm_get_events_test.m index 97abecbbb..81be3e728 100644 --- a/test/pspm_get_events_test.m +++ b/test/pspm_get_events_test.m @@ -3,7 +3,7 @@ % unittest class for the pspm_get_events function %__________________________________________________________________________ % SCRalyze TestEnvironment -% (C) 2013 Linus Rόttimann (University of Zurich) +% (C) 2013 Linus RοΏ½ttimann (University of Zurich) methods function check = checkFlankChange(this, positions, data) @@ -70,7 +70,8 @@ function continuous(this) [sts, rimport] = pspm_get_events(import); this.verifyEqual(sts, 1); this.verifyTrue(length(rimport.data) == length(rimport.markerinfo.value)); - this.verifyTrue(length(rimport.data) == length(d)); + %if we invert the signal, number of markers denoted by high signals is one more! + this.verifyTrue(length(rimport.data) == length(d) + 1); import.data = -1 * import.data; import.flank = 'ascending';