rmeddis@0: % expGUI_MT = 'experimenter GUI for multiThreshold rmeddis@0: % allows the experimenter to design experiments. rmeddis@0: % The *running* of experiments is left to subjGUI.m rmeddis@0: % rmeddis@0: % There are three kinds of experiments known as 'earOptions': rmeddis@0: % 1. Measurements using real listeners rmeddis@0: % 'left', 'right', 'diotic', 'dichoticLeft', 'dichoticRight' rmeddis@0: % 2. Measurements using the MAP model as the subject rmeddis@0: % 'MAPmodelListen', 'MAPmodelMultiCh', 'MAPmodelSingleCh' rmeddis@0: % 3. Monte Carlo simulations rmeddis@0: % 'statsModelLogistic','statsModelRareEvent' rmeddis@0: % rmeddis@0: % There are many stimulus configurations relating to different measurement rmeddis@0: % requirements. These configurations are defined in paradigm files located rmeddis@0: % in the 'paradigms' folder with names of the form paradigm_.m. These rmeddis@0: % files specify values in the stimulusParameter and experiment structures. rmeddis@0: % Some minor parameters are specified in the intialiseGUI function below. rmeddis@0: % Each configuration is only a start up arrangement and the user can modify rmeddis@0: % the parameters on the GUI itself. rmeddis@0: % rmeddis@0: % the 'RUN' button initiates the measurements and hands control over to the rmeddis@0: % subjGUI program. When the measurements are complete control is handed rmeddis@0: % back and the stack unwinds without any further action rmeddis@0: rmeddis@0: function varargout = expGUI_MT(varargin) rmeddis@0: %EXPGUI_MT M-file for expGUI_MT.fig rmeddis@0: % EXPGUI_MT, by itself, creates a new EXPGUI_MT or raises the existing rmeddis@0: % singleton*. rmeddis@0: % rmeddis@0: % H = EXPGUI_MT returns the handle to a new EXPGUI_MT or the handle to rmeddis@0: % the existing singleton*. rmeddis@0: % rmeddis@0: % EXPGUI_MT('Property','Value',...) creates a new EXPGUI_MT using the rmeddis@0: % given property value pairs. Unrecognized properties are passed via rmeddis@0: % varargin to expGUI_MT_OpeningFcn. This calling syntax produces a rmeddis@0: % warning when there is an existing singleton*. rmeddis@0: % rmeddis@0: % EXPGUI_MT('CALLBACK') and EXPGUI_MT('CALLBACK',hObject,...) call the rmeddis@0: % local function named CALLBACK in EXPGUI_MT.M with the given input rmeddis@0: % arguments. rmeddis@0: % rmeddis@0: % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one rmeddis@0: % instance to run (singleton)". rmeddis@0: % rmeddis@0: % See also: GUIDE, GUIDATA, GUIHANDLES rmeddis@0: rmeddis@0: % Edit the above text to modify the response to help expGUI_MT rmeddis@0: rmeddis@0: % Last Modified by GUIDE v2.5 07-Apr-2011 07:20:00 rmeddis@0: rmeddis@0: % Begin initialization code - DO NOT EDIT rmeddis@0: gui_Singleton = 1; rmeddis@0: gui_State = struct('gui_Name', mfilename, ... rmeddis@0: 'gui_Singleton', gui_Singleton, ... rmeddis@0: 'gui_OpeningFcn', @expGUI_MT_OpeningFcn, ... rmeddis@0: 'gui_OutputFcn', @expGUI_MT_OutputFcn, ... rmeddis@0: 'gui_LayoutFcn', [], ... rmeddis@0: 'gui_Callback', []); rmeddis@0: if nargin && ischar(varargin{1}) rmeddis@0: gui_State.gui_Callback = str2func(varargin{1}); rmeddis@0: end rmeddis@0: rmeddis@0: if nargout rmeddis@0: [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); rmeddis@0: else rmeddis@0: gui_mainfcn(gui_State, varargin{:}); rmeddis@0: end rmeddis@0: % End initialization code - DO NOT EDIT rmeddis@0: rmeddis@0: % -------------------------------------------------- expGUI_MT_OpeningFcn rmeddis@0: function expGUI_MT_OpeningFcn(hObject, eventdata, handles, varargin) rmeddis@0: rmeddis@0: % Choose default command line output for expGUI_MT rmeddis@0: handles.output = hObject; rmeddis@0: rmeddis@0: cla(handles.axes1) rmeddis@0: cla(handles.axes2) rmeddis@0: cla(handles.axes4) rmeddis@0: cla(handles.axes5) rmeddis@0: rmeddis@0: % Update handles structure rmeddis@0: guidata(hObject, handles); rmeddis@0: rmeddis@0: function varargout = expGUI_MT_OutputFcn(hObject, eventdata, handles) rmeddis@0: % Get default command line output from handles structure rmeddis@0: initializeGUI(handles) rmeddis@0: varargout{1} = handles.output; rmeddis@0: setLocationOfGUIs(handles) rmeddis@0: rmeddis@0: function setLocationOfGUIs(handles) rmeddis@0: global checkForPreviousGUI % holds screen positioning across repeated calls rmeddis@0: scrnsize=get(0,'screensize'); rmeddis@0: checkForPreviousGUI=[]; rmeddis@0: % if isstruct(checkForPreviousGUI)... rmeddis@0: % && checkForPreviousGUI.GUIalreadyStarted==1 ... rmeddis@0: % && isfield(checkForPreviousGUI,'GUIposition') rmeddis@0: % set(handles.figure1,'position',checkForPreviousGUI.GUIposition) rmeddis@0: % else rmeddis@0: % % relocate the GUI only if this is the first time of use rmeddis@0: % set(0, 'units','pixels') rmeddis@0: % % occupies top to bottom of screen but only 60% width rmeddis@0: % % [left bottom width height] rmeddis@0: % firstPos=[0.01*scrnsize(4) 0.03*scrnsize(3) 0.6*scrnsize(3) 0.92*scrnsize(4)]; rmeddis@0: % firstPos=[4 0.045*scrnsize(4) 0.6*scrnsize(3) 0.93*scrnsize(4)]; rmeddis@0: % set(handles.figure1, 'units','pixels') rmeddis@0: % set(handles.figure1,'position',firstPos) rmeddis@0: % checkForPreviousGUI.GUIalreadyStarted=1; rmeddis@0: % checkForPreviousGUI.GUIposition=firstPos; rmeddis@0: % end rmeddis@0: set(handles.figure1,'color',[.871 .961 .996]) rmeddis@0: set(handles.figure1,'name', pwd) rmeddis@0: rmeddis@0: % MAP model figure; sits alongside GUI if requested rmeddis@0: figure(99) rmeddis@0: % [left bottom width height] rmeddis@0: MAPpos=[0.615*scrnsize(3) 0.05*scrnsize(4) 0.15*scrnsize(3) 0.85*scrnsize(4)]; rmeddis@0: % visible only on request. rmeddis@0: set(gcf,'position',MAPpos , 'visible','off') rmeddis@0: rmeddis@0: rmeddis@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@0: rmeddis@0: % -----------------------------------------------------initializeGUI rmeddis@0: function initializeGUI(handles) rmeddis@0: % Populate the edit boxes and popup menus on the GUI rmeddis@0: % Then wait for user action rmeddis@0: global stimulusParameters experiment betweenRuns rmeddis@0: global targetTypes maskerTypes backgroundTypes rmeddis@0: global variableNames paradigmNames threshEstNames cueNames rmeddis@0: rmeddis@0: % dbstop if error % allow for debugging and user error reporting rmeddis@0: % dbstop if warning rmeddis@0: rmeddis@0: % specify structure fields for pretty automatic printing rmeddis@0: % It also initialises some simple variables rmeddis@0: orderGlobals rmeddis@0: rmeddis@0: addpath ('paradigms') % preset paradigm informations is stored here rmeddis@0: % filesep is usd to be compatible with other operating systems rmeddis@0: % addpath (['..' filesep 'modules'], ['..' filesep 'utilities'], ... rmeddis@0: % ['..' filesep 'parameterStore'], ['..' filesep 'wavFileStore'],... rmeddis@0: % ['..' filesep 'testPrograms']) rmeddis@0: rmeddis@0: % specify all variables that need to be set on the GUI rmeddis@0: variableNames={'stimulusDelay','maskerDuration','maskerLevel',... rmeddis@0: 'maskerRelativeFrequency', 'targetFrequency', 'gapDuration',... rmeddis@0: 'targetDuration','targetLevel','rampDuration',... rmeddis@0: 'cueTestDifference', 'WRVstartValues', 'WRVsteps', 'WRVlimits'}; rmeddis@0: rmeddis@0: % Variable variables rmeddis@0: % (specifies paradigm paramaters that can changed on a 'between runs' basis) rmeddis@0: % make them options in the two between runs variable menus rmeddis@0: % NB 'numOHIOtones' is used only to solve a problem; it should not be rmeddis@0: % selected manually rmeddis@0: betweenRunsVariables={'stimulusDelay','maskerDuration','maskerLevel',... rmeddis@0: 'maskerRelativeFrequency','targetFrequency', 'gapDuration',... rmeddis@0: 'targetDuration','targetLevel','numOHIOtones'}; rmeddis@0: set(handles.popupmenuVaryParameter1,'string',betweenRunsVariables) rmeddis@0: set(handles.popupmenuVaryParameter2,'string',betweenRunsVariables) rmeddis@0: rmeddis@0: % NB 'Warning: popupmenu control requires a scalar Value' rmeddis@0: % indicates that an inappropriate 'value' is being set. rmeddis@0: % when testing for this, always clear the GUI before running rmeddis@0: rmeddis@0: % Trial presentation order - randomize at startup rmeddis@0: presentationOrderNames={'randomize within blocks', 'fixed sequence', ... rmeddis@0: 'randomize across blocks'}; rmeddis@0: set(handles.popupmenuRandomize,'string', presentationOrderNames) rmeddis@0: rmeddis@0: % targetType- value must be set in paradigm rmeddis@0: targetTypes={'tone','noise', 'pinkNoise','whiteNoise','24TalkerBabble',... rmeddis@0: 'speech', 'Twister','digitStrings'}; rmeddis@0: set(handles.popupmenuTargetType, 'string', targetTypes); rmeddis@0: rmeddis@0: % maskerType - value must be set in paradigm rmeddis@0: maskerTypes={'tone','noise', 'pinkNoise','TEN','whiteNoise','24TalkerBabble', ... rmeddis@0: 'speech'}; rmeddis@0: set(handles.popupmenuMaskerType, 'string', maskerTypes); rmeddis@0: rmeddis@0: % background Type- value must be set in paradigm (default = 1, 'none') rmeddis@0: backgroundTypes={'none','noise', 'pinkNoise', 'TEN','noiseDich',... rmeddis@0: 'pinkNoiseDich','whiteNoise','24TalkerBabble',... rmeddis@0: '16TalkerBabble','8TalkerBabble','4TalkerBabble',... rmeddis@0: '4TalkerReversedBabble','2TalkerBabble','1TalkerBabble'}; rmeddis@0: set(handles.popupmenuBackgroundType, 'string', backgroundTypes); rmeddis@0: set(handles.editBackgroundLevel,'string',... rmeddis@0: num2str(stimulusParameters.backgroundLevel)) rmeddis@0: rmeddis@0: % Establish available paradigms by scanning paradigms folder rmeddis@0: paradigmNames= what('paradigms'); rmeddis@0: paradigmNames=paradigmNames.m; % m files only rmeddis@0: for i=1:length(paradigmNames), paradigmNames{i}=paradigmNames{i}(10:end-2); end rmeddis@0: set(handles.popupmenuParadigm,'string', paradigmNames) rmeddis@0: rmeddis@0: % startup paradigm, 'training' (could be anywhere on the list) rmeddis@0: startupParadigm='training'; rmeddis@0: idx= find(strcmp(paradigmNames,startupParadigm)); rmeddis@0: if ~isempty(idx) rmeddis@0: set(handles.popupmenuParadigm,'value', idx) rmeddis@0: else rmeddis@0: % training paradigm is always the startup paradigm rmeddis@0: error(['expGUI_MT\initializeGUI: No ' startupParadigm... rmeddis@0: ' paradigm found in paradigms folder']) rmeddis@0: end rmeddis@0: rmeddis@0: earOptions={'left', 'right', 'diotic', 'dichoticLeft', 'dichoticRight',... rmeddis@0: 'MAPmodelListen', 'MAPmodelMultiCh', 'MAPmodelSingleCh'... rmeddis@0: 'statsModelLogistic','statsModelRareEvent'}; rmeddis@0: set(handles.popupmenuEar,'string', earOptions) rmeddis@0: defaultOption=1; rmeddis@0: experiment.ear=earOptions{defaultOption}; rmeddis@0: set(handles.popupmenuEar,'value', defaultOption) % 'left' is deafult rmeddis@0: set(handles.pushbuttonSingleShot, 'visible', 'off') % use only for MAP rmeddis@0: rmeddis@0: % masker phase box- value must be set in paradigm rmeddis@0: phaseOptions={'sin','cos','alt','rand'}; rmeddis@0: set(handles.popupmenuPhase,'string', phaseOptions) rmeddis@0: rmeddis@0: % Cue rmeddis@0: cueNames={'cued', 'noCue'}; rmeddis@0: set(handles.popupmenuCueNoCue, 'string', cueNames); rmeddis@0: rmeddis@0: % threshold assessment method - value must be set in paradigm rmeddis@0: threshEstNames={'oneIntervalUpDown', 'MaxLikelihood', ... rmeddis@0: '2I2AFC++', '2I2AFC+++'}; rmeddis@0: set(handles.popupmenuThreshEst, 'string', threshEstNames); rmeddis@0: experiment.stopCriteria2IFC=[75 3 5]; rmeddis@0: experiment.stopCriteriaSI=[20]; rmeddis@0: rmeddis@0: % ** editBoxes that are only set by hand rmeddis@0: % music (relative) level, 'tada!' (manual setting only) rmeddis@0: % increase for the hard of hearing rmeddis@0: set(handles.editMusicLevel,'string','0') rmeddis@0: rmeddis@0: % Catch Trial Rate rmeddis@0: set(handles.editCatchTrialRate,'string','0.2 0.1 2 '); rmeddis@0: rmeddis@0: % calibration rmeddis@0: stimulusParameters.restoreCalibration=7; rmeddis@0: set(handles.editcalibrationdB,'string',... rmeddis@0: stimulusParameters.restoreCalibration) rmeddis@0: rmeddis@0: % a MAPplot rmeddis@0: experiment.MAPplot=0; %default rmeddis@0: set(handles.editMAPplot,'string',num2str(experiment.MAPplot)) rmeddis@0: rmeddis@0: % saveData rmeddis@0: experiment.saveData=1; rmeddis@0: set(handles.editSaveData,'string',num2str(experiment.saveData)) rmeddis@0: rmeddis@0: % printTracks rmeddis@0: experiment.printTracks=0; rmeddis@0: set(handles.editPrintTracks,'string',num2str(experiment.printTracks)) rmeddis@0: rmeddis@0: % standard delay between button press and initiation of next stimulus rmeddis@0: experiment.clickToStimulusPause=1; rmeddis@0: rmeddis@0: % buttonBoxType: NB no problem if mouse is used instead rmeddis@0: experiment.buttonBoxType='square'; rmeddis@0: rmeddis@0: % estimation of the mean rmeddis@0: % {'logisticLS', 'logisticML', 'rareEvent'} rmeddis@0: experiment.functionEstMethod='logisticLS'; rmeddis@0: rmeddis@0: % message box rmeddis@0: set(handles.textMSG,'backgroundcolor', 'w', 'ForegroundColor', 'b', 'string', '') rmeddis@0: set(handles.editMsgFont,'string','7') rmeddis@0: set(handles.editSubjectFont,'string','14') rmeddis@0: rmeddis@0: % default psychometric bin size and logistic slopes rmeddis@0: experiment.psyBinWidth=1; % dB rmeddis@0: maxLogisticK=2; % steepest slope contemplated rmeddis@0: experiment.maxLogisticK=maxLogisticK; rmeddis@0: experiment.numPossLogisticK=100; rmeddis@0: experiment.possLogSlopes= ... rmeddis@0: 0.01: maxLogisticK/experiment.numPossLogisticK: maxLogisticK; rmeddis@0: experiment.meanSearchStep=0.25; % dB rmeddis@0: rmeddis@0: % indicate that this is the first run and the GUI should be located in rmeddis@0: % default location. rmeddis@0: experiment.justInitialized=1; rmeddis@0: rmeddis@0: % set up GUI based on training paradigm rmeddis@0: aParadigmSelection(handles); rmeddis@0: earSetUp(handles) rmeddis@0: aThresholdAssessmentMethod(handles) rmeddis@0: aShowRelevantObjects(handles) rmeddis@0: rmeddis@0: % Done. Now wait for action rmeddis@0: rmeddis@0: % -------------------------------------------- popupmenuMaskerType_Callback rmeddis@0: function popupmenuMaskerType_Callback(hObject, eventdata, handles) rmeddis@0: % show or remove masker frequency box rmeddis@0: aShowRelevantObjects(handles) rmeddis@0: rmeddis@0: % -------------------------------------------- popupmenuTargetType_Callback rmeddis@0: function popupmenuTargetType_Callback(hObject, eventdata, handles) rmeddis@0: % show or remove target frequency box rmeddis@0: aShowRelevantObjects(handles) rmeddis@0: rmeddis@0: % -------------------------------------------- popupmenuParadigm_Callback rmeddis@0: function popupmenuParadigm_Callback(hObject, eventdata, handles) rmeddis@0: % Any change to the paradigm selection causes all boxes to be shown rmeddis@0: % showParameters(handles) rmeddis@0: aParadigmSelection(handles); rmeddis@0: rmeddis@0: % -------------------------------------------- aParadigmSelection rmeddis@0: function aParadigmSelection(handles) rmeddis@0: global experiment stimulusParameters betweenRuns paradigmNames rmeddis@0: global variableNames rmeddis@0: rmeddis@0: % identify paradigm selected rmeddis@0: chosenOption=get(handles.popupmenuParadigm,'value'); rmeddis@0: paradigm=paradigmNames{chosenOption}; rmeddis@0: experiment.paradigm=paradigm; rmeddis@0: rmeddis@0: %Paradigm: read in all relevant parameters rmeddis@0: % a file must exist with this name 'paradigm_' rmeddis@0: % 'handles' are only occasionally used rmeddis@0: addpath ('paradigms') rmeddis@0: cmd=['paradigm_' paradigm '(handles);']; rmeddis@0: try rmeddis@0: eval(cmd) rmeddis@0: catch rmeddis@0: error(['ExpGUI\aParadigmSelection:'... rmeddis@0: 'paradigm file not found or error in file']) rmeddis@0: end rmeddis@0: rmpath ('paradigms') rmeddis@0: rmeddis@0: % if a variable is subject to change, specify list of values here rmeddis@0: % eg. stimulusParameters.targetFrequency=betweenRuns.variableList1; rmeddis@0: cmd=['stimulusParameters.' ... rmeddis@0: betweenRuns.variableName1 '=betweenRuns.variableList1;']; rmeddis@0: eval (cmd); rmeddis@0: cmd=['stimulusParameters.' ... rmeddis@0: betweenRuns.variableName2 '=betweenRuns.variableList2;']; rmeddis@0: eval (cmd); rmeddis@0: rmeddis@0: % establish popup menus on the basis of the paradigm file rmeddis@0: set(handles.popupmenuRandomize,'value', betweenRuns.randomizeSequence) rmeddis@0: set(handles.popupmenuPhase,'string', stimulusParameters.maskerPhase) rmeddis@0: if stimulusParameters.includeCue rmeddis@0: set(handles.popupmenuCueNoCue,'value', 1) rmeddis@0: else rmeddis@0: set(handles.popupmenuCueNoCue,'value', 2) rmeddis@0: end rmeddis@0: rmeddis@0: set(handles.text34, 'string', stimulusParameters.WRVname) rmeddis@0: rmeddis@0: % Put the new data values into the edit boxes on the GUI rmeddis@0: for i=1:length(variableNames) rmeddis@0: cmd=(['set(handles.edit' variableNames{i} ... rmeddis@0: ',''string'', num2str(stimulusParameters.' ... rmeddis@0: variableNames{i} '));']); rmeddis@0: eval(cmd); rmeddis@0: end rmeddis@0: % backgroundLevel is not a variableName (?!) rmeddis@0: set(handles.editBackgroundLevel,'string', num2str... rmeddis@0: (stimulusParameters.backgroundLevel)) rmeddis@0: rmeddis@0: % on RUN the sample rate will be picked from the text box rmeddis@0: % However, MAP overrules the sample rate and sets its own rmeddis@0: aSetSampleRate(stimulusParameters.subjectSampleRate, handles); rmeddis@0: rmeddis@0: rmeddis@0: % used for plotting functions (NB affected by paradigm settings) rmeddis@0: experiment.predictionLevels=stimulusParameters.WRVlimits(1):... rmeddis@0: experiment.meanSearchStep:stimulusParameters.WRVlimits(2); rmeddis@0: experiment.possLogSlopes=abs(experiment.possLogSlopes)*... rmeddis@0: sign(experiment.psyFunSlope); rmeddis@0: rmeddis@0: aResetPopupMenus(handles) rmeddis@0: rmeddis@0: % ------------------------------------------------------ aResetPopupMenus rmeddis@0: function aResetPopupMenus(handles) rmeddis@0: global stimulusParameters betweenRuns variableNames rmeddis@0: global targetTypes maskerTypes experiment backgroundTypes rmeddis@0: rmeddis@0: switch experiment.threshEstMethod rmeddis@0: case {'MaxLikelihood','oneIntervalUpDown'} rmeddis@0: set(handles.editstopCriteriaBox, 'string', ... rmeddis@0: num2str(experiment.singleIntervalMaxTrials)) rmeddis@0: rmeddis@0: case {'2I2AFC++','2I2AFC+++'} rmeddis@0: set(handles.editstopCriteriaBox, 'string', ... rmeddis@0: num2str(experiment.stopCriteria2IFC)) rmeddis@0: otherwise rmeddis@0: error([' aResetPopupMenus: threshEstMethod not recognised -> ' ... rmeddis@0: experiment.threshEstMethod]) rmeddis@0: end rmeddis@0: rmeddis@0: % forced noCue rmeddis@0: switch experiment.paradigm rmeddis@0: case 'discomfort' rmeddis@0: set(handles.popupmenuCueNoCue,'value', 2) rmeddis@0: end rmeddis@0: rmeddis@0: %set variables popupmenus as specified in betweenRuns rmeddis@0: variableParameter1ID=0; variableParameter2ID=0; rmeddis@0: for i=1:length(variableNames) rmeddis@0: if strcmp(variableNames{i},betweenRuns.variableName1) rmeddis@0: variableParameter1ID=i; rmeddis@0: end rmeddis@0: if strcmp(variableNames{i},betweenRuns.variableName2) rmeddis@0: variableParameter2ID=i; rmeddis@0: end rmeddis@0: end rmeddis@0: if variableParameter1ID==0 || variableParameter2ID==0; rmeddis@0: Error('a ResetPopMenu: variableParameter not identified') rmeddis@0: end rmeddis@0: rmeddis@0: % display popupmenus rmeddis@0: set(handles.popupmenuVaryParameter1, 'value',round(variableParameter1ID)) rmeddis@0: set(handles.popupmenuVaryParameter2, 'value',round(variableParameter2ID)) rmeddis@0: rmeddis@0: % targetType rmeddis@0: idx= find(strcmp(stimulusParameters.targetType, targetTypes)); rmeddis@0: set(handles.popupmenuTargetType,'value', idx) rmeddis@0: rmeddis@0: % paradigm selection may alter the maskerType rmeddis@0: idx= find(strcmp(stimulusParameters.maskerType, maskerTypes)); rmeddis@0: set(handles.popupmenuMaskerType,'value', idx) rmeddis@0: rmeddis@0: aShowRelevantObjects(handles) rmeddis@0: rmeddis@0: % % backgroundType rmeddis@0: idx= find(strcmp(stimulusParameters.backgroundType, backgroundTypes)); rmeddis@0: set(handles.popupmenuBackgroundType,'value', idx) rmeddis@0: set(handles.editBackgroundLevel,'string', ... rmeddis@0: num2str(stimulusParameters.backgroundLevel)) rmeddis@0: rmeddis@0: % ---------------------------------------------- aShowRelevantObjects rmeddis@0: function aShowRelevantObjects(handles) rmeddis@0: global experiment stimulusParameters rmeddis@0: % always on rmeddis@0: set(handles.edittargetLevel, 'visible', 'on') rmeddis@0: set(handles.edittargetDuration, 'visible', 'on') rmeddis@0: set(handles.edittargetFrequency, 'visible', 'on') rmeddis@0: rmeddis@0: switch experiment.ear rmeddis@0: case {'statsModelLogistic', 'statsModelRareEvent'} rmeddis@0: set(handles.editStatsModel, 'visible', 'on') rmeddis@0: set(handles.textStatsModel, 'visible', 'on') rmeddis@0: set(handles.pushbuttonStop, 'visible', 'on') rmeddis@0: set(handles.pushbuttonOME, 'visible', 'off') rmeddis@0: set(handles.pushbuttonBM, 'visible', 'off') rmeddis@0: set(handles.pushbuttonRP, 'visible', 'off') rmeddis@0: set(handles.pushbuttonAN, 'visible', 'off') rmeddis@0: set(handles.pushbuttonRF, 'visible', 'off') rmeddis@0: set(handles.pushbuttonSYN, 'visible', 'off') rmeddis@0: set(handles.pushbuttonFM, 'visible', 'off') rmeddis@0: set(handles.pushbuttonParams, 'visible', 'off') rmeddis@0: set(handles.pushbuttonSingleShot, 'visible', 'off') rmeddis@0: set(handles.editCatchTrialRate, 'visible', 'off') rmeddis@0: set(handles.textCatchTrials, 'visible', 'off') rmeddis@0: set(handles.editcalibrationdB, 'visible', 'off') rmeddis@0: set(handles.textcalibration, 'visible', 'off') rmeddis@0: set(handles.popupmenuCueNoCue, 'visible', 'off') rmeddis@0: set(handles.textCue, 'visible', 'off') rmeddis@0: set(handles.editMusicLevel,'visible', 'off') rmeddis@0: set(handles.textMusicLevel,'visible', 'off') rmeddis@0: set(handles.editMAPplot,'visible', 'off') rmeddis@0: set(handles.textMAPplot,'visible', 'off') rmeddis@0: rmeddis@0: case {'MAPmodel', 'MAPmodelListen', 'MAPmodelMultiCh', 'MAPmodelSingleCh'} rmeddis@0: set(handles.popupmenuCueNoCue, 'visible', 'off') rmeddis@0: set(handles.editStatsModel, 'visible', 'off') rmeddis@0: set(handles.textStatsModel, 'visible', 'off') rmeddis@0: set(handles.pushbuttonStop, 'visible', 'on') rmeddis@0: set(handles.pushbuttonOME, 'visible', 'on') rmeddis@0: set(handles.pushbuttonBM, 'visible', 'on') rmeddis@0: set(handles.pushbuttonRP, 'visible', 'on') rmeddis@0: set(handles.pushbuttonAN, 'visible', 'on') rmeddis@0: set(handles.pushbuttonRF, 'visible', 'on') rmeddis@0: set(handles.pushbuttonSYN, 'visible', 'on') rmeddis@0: set(handles.pushbuttonFM, 'visible', 'on') rmeddis@0: set(handles.pushbuttonParams, 'visible', 'on') rmeddis@0: set(handles.pushbuttonSingleShot, 'visible', 'on') rmeddis@0: set(handles.editcalibrationdB, 'visible', 'off') rmeddis@0: set(handles.textcalibration, 'visible', 'off') rmeddis@0: set(handles.textCue, 'visible', 'off') rmeddis@0: set(handles.editMusicLevel,'visible', 'off') rmeddis@0: set(handles.textMusicLevel,'visible', 'off') rmeddis@0: set(handles.editMAPplot,'visible', 'on') rmeddis@0: set(handles.textMAPplot,'visible', 'on') rmeddis@0: rmeddis@0: otherwise rmeddis@0: set(handles.editStatsModel, 'visible', 'off') rmeddis@0: set(handles.textStatsModel, 'visible', 'off') rmeddis@0: set(handles.pushbuttonStop, 'visible', 'off') rmeddis@0: set(handles.pushbuttonOME, 'visible', 'off') rmeddis@0: set(handles.pushbuttonBM, 'visible', 'off') rmeddis@0: set(handles.pushbuttonRP, 'visible', 'off') rmeddis@0: set(handles.pushbuttonAN, 'visible', 'off') rmeddis@0: set(handles.pushbuttonRF, 'visible', 'off') rmeddis@0: set(handles.pushbuttonSYN, 'visible', 'off') rmeddis@0: set(handles.pushbuttonFM, 'visible', 'off') rmeddis@0: set(handles.pushbuttonParams, 'visible', 'off') rmeddis@0: set(handles.pushbuttonSingleShot, 'visible', 'off') rmeddis@0: set(handles.editCatchTrialRate, 'visible', 'on') rmeddis@0: set(handles.textCatchTrials, 'visible', 'on') rmeddis@0: set(handles.editcalibrationdB, 'visible', 'on') rmeddis@0: set(handles.textcalibration, 'visible', 'on') rmeddis@0: set(handles.popupmenuCueNoCue, 'visible', 'on') rmeddis@0: set(handles.textCue, 'visible', 'on') rmeddis@0: set(handles.editMusicLevel,'visible', 'on') rmeddis@0: set(handles.textMusicLevel,'visible', 'on') rmeddis@0: set(handles.editMAPplot,'visible', 'off') rmeddis@0: set(handles.textMAPplot,'visible', 'off') rmeddis@0: end rmeddis@0: rmeddis@0: switch experiment.threshEstMethod rmeddis@0: case {'MaxLikelihood','oneIntervalUpDown'} rmeddis@0: set(handles.popupmenuCueNoCue,'visible', 'on') rmeddis@0: set(handles.textCue,'visible', 'on') rmeddis@0: set(handles.editstopCriteriaBox, 'string', ... rmeddis@0: num2str(experiment.singleIntervalMaxTrials)) rmeddis@0: rmeddis@0: if stimulusParameters.includeCue==0 rmeddis@0: set(handles.editcueTestDifference,'visible', 'off') rmeddis@0: set(handles.textcueTestDifference,'visible', 'off') rmeddis@0: else rmeddis@0: set(handles.editcueTestDifference,'visible', 'on') rmeddis@0: set(handles.textcueTestDifference,'visible', 'on') rmeddis@0: end rmeddis@0: rmeddis@0: case {'2I2AFC++','2I2AFC+++'} rmeddis@0: set(handles.editCatchTrialRate, 'visible', 'off') rmeddis@0: set(handles.textCatchTrials, 'visible', 'off') rmeddis@0: set(handles.popupmenuCueNoCue,'visible', 'off') rmeddis@0: set(handles.textCue,'visible', 'off') rmeddis@0: set(handles.editcueTestDifference,'visible', 'off') rmeddis@0: set(handles.textcueTestDifference,'visible', 'off') rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: % show/ remove masker related boxes rmeddis@0: switch experiment.paradigm rmeddis@0: % masker free paradigms rmeddis@0: case {'training', 'discomfort','absThreshold', 'absThreshold_8',... rmeddis@0: 'TENtest', 'threshold_duration','SRT'} rmeddis@0: set(handles.editmaskerDuration,'visible', 'off') rmeddis@0: set(handles.editmaskerLevel,'visible', 'off') rmeddis@0: set(handles.editmaskerRelativeFrequency,'visible', 'off') rmeddis@0: set(handles.editgapDuration,'visible', 'off') rmeddis@0: set(handles.textmaskerDuration,'visible', 'off') rmeddis@0: set(handles.textmaskerLevel,'visible', 'off') rmeddis@0: set(handles.textmaskerRelativeFrequency,'visible', 'off') rmeddis@0: set(handles.textgapDuration,'visible', 'off') rmeddis@0: set(handles.popupmenuMaskerType,'visible', 'off') rmeddis@0: set(handles.textMaskerType,'visible', 'off') rmeddis@0: rmeddis@0: % paradigms with maskers rmeddis@0: case {'forwardMasking','forwardMaskingD','trainingIFMC', 'TMC','TMC_16ms', ... rmeddis@0: 'TMCmodel','IFMC','IFMC_8ms','GOM','overShoot','overShootB',... rmeddis@0: 'gapDetection', 'psychometric', 'FMreProbe'} rmeddis@0: set(handles.editmaskerDuration,'visible', 'on') rmeddis@0: set(handles.editmaskerLevel,'visible', 'on') rmeddis@0: set(handles.editmaskerRelativeFrequency,'visible', 'on') rmeddis@0: set(handles.editgapDuration,'visible', 'on') rmeddis@0: set(handles.popupmenuMaskerType,'visible', 'on') rmeddis@0: set(handles.textmaskerDuration,'visible', 'on') rmeddis@0: set(handles.textmaskerLevel,'visible', 'on') rmeddis@0: set(handles.textmaskerRelativeFrequency,'visible', 'on') rmeddis@0: set(handles.textgapDuration,'visible', 'on') rmeddis@0: set(handles.popupmenuMaskerType,'visible', 'on') rmeddis@0: set(handles.textMaskerType,'visible', 'on') rmeddis@0: % masker relative frequency /type rmeddis@0: chosenOption=get(handles.popupmenuMaskerType,'value'); rmeddis@0: maskerTypes=get(handles.popupmenuMaskerType,'string'); rmeddis@0: maskerType=maskerTypes{chosenOption}; rmeddis@0: switch maskerType rmeddis@0: case 'tone' rmeddis@0: set(handles.editmaskerRelativeFrequency,'visible', 'on') rmeddis@0: otherwise rmeddis@0: set(handles.editmaskerRelativeFrequency,'visible', 'off') rmeddis@0: end rmeddis@0: end rmeddis@0: rmeddis@0: eval(['set(handles.edit' stimulusParameters.WRVname ... rmeddis@0: ',''visible'',''off'' )']) rmeddis@0: rmeddis@0: % target type rmeddis@0: chosenOption=get(handles.popupmenuTargetType,'value'); rmeddis@0: targetTypes=get(handles.popupmenuTargetType,'string'); rmeddis@0: targetType=targetTypes{chosenOption}; rmeddis@0: switch targetType rmeddis@0: case 'tone' rmeddis@0: set(handles.edittargetFrequency,'visible', 'on') rmeddis@0: otherwise rmeddis@0: set(handles.edittargetFrequency,'visible', 'off') rmeddis@0: end rmeddis@0: rmeddis@0: if strcmp(stimulusParameters.backgroundType,'none') rmeddis@0: set(handles.popupmenuBackgroundType, 'visible', 'on'); rmeddis@0: set(handles.editBackgroundLevel,'visible','off') rmeddis@0: set(handles.textBGlevel,'visible','off') rmeddis@0: else rmeddis@0: set(handles.popupmenuBackgroundType, 'visible', 'on'); rmeddis@0: set(handles.editBackgroundLevel,'visible','on') rmeddis@0: set(handles.textBGlevel,'visible','on') rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: rmeddis@0: % ------------------------------------------------ pushbuttonRun_Callback rmeddis@0: function pushbuttonRun_Callback(hObject, eventdata, handles) rmeddis@0: global checkForPreviousGUI % holds screen positioning across repeated calls rmeddis@0: global experiment rmeddis@0: checkForPreviousGUI.GUIposition=get(handles.figure1,'position'); rmeddis@0: experiment.singleShot=0; rmeddis@0: run (handles) rmeddis@0: experiment.stop=0; rmeddis@0: rmeddis@0: function run (handles) rmeddis@0: global experiment expGUIhandles stimulusParameters rmeddis@0: tic rmeddis@0: expGUIhandles=handles; rmeddis@0: set(handles.pushbuttonStop, 'backgroundColor', [.941 .941 .941]) rmeddis@0: rmeddis@0: % message box white (removes any previous error message) rmeddis@0: set(handles.textMSG,... rmeddis@0: 'backgroundcolor', 'w', 'ForegroundColor', 'b', 'string', '') rmeddis@0: rmeddis@0: errorMsg=aReadAndCheckParameterBoxes(handles); rmeddis@0: if ~isempty(errorMsg) rmeddis@0: append=0; rmeddis@0: warning=1; rmeddis@0: addToMsg(['error message:' errorMsg], append, warning) rmeddis@0: return rmeddis@0: end rmeddis@0: rmeddis@0: if isnan(stimulusParameters.targetLevel) rmeddis@0: addToMsg('Error: targetlevel not set', 1) rmeddis@0: error('Error: targetlevel not set') rmeddis@0: end rmeddis@0: rmeddis@0: set(handles.textMSG,'backgroundcolor', 'w') rmeddis@0: set(handles.textMSG,'string', ' ') rmeddis@0: rmeddis@0: % leave the program and start up multiThreshold rmeddis@0: subjGUI_MT % leave the program and start up multiThreshold rmeddis@0: experiment.justInitialized=0;% prevents moving subjectGUI rmeddis@0: toc rmeddis@0: rmeddis@0: % --- Executes on button press in pushbuttonSingleShot. rmeddis@0: function pushbuttonSingleShot_Callback(hObject, eventdata, handles) rmeddis@0: global experiment rmeddis@0: experiment.singleShot=1; rmeddis@0: rmeddis@0: % special test for spontaneous activity rmeddis@0: x=get(handles.editWRVstartValues, 'string'); rmeddis@0: y=get(handles.edittargetDuration, 'string'); rmeddis@0: set(handles.editWRVstartValues, 'string', '-20') rmeddis@0: set(handles.edittargetDuration, 'string', '1') rmeddis@0: rmeddis@0: MAPplot=get(handles.editMAPplot, 'string'); rmeddis@0: set(handles.editMAPplot, 'string', '1') rmeddis@0: drawnow rmeddis@0: rmeddis@0: run (handles) rmeddis@0: rmeddis@0: set(handles.editMAPplot, 'string', MAPplot) rmeddis@0: set(handles.editWRVstartValues, 'string', x) rmeddis@0: set(handles.edittargetDuration, 'string', y) rmeddis@0: rmeddis@0: % ------------------------------------------aReadAndCheckParameterBoxes rmeddis@0: function errorMsg=aReadAndCheckParameterBoxes(handles) rmeddis@0: global experiment stimulusParameters betweenRuns statsModel rmeddis@0: global variableNames LevittControl rmeddis@0: % When the program sets the parameters all should be well rmeddis@0: % But when the user changes them... rmeddis@0: rmeddis@0: errorMsg=''; rmeddis@0: rmeddis@0: % name rmeddis@0: experiment.name=get(handles.editName,'string'); rmeddis@0: rmeddis@0: % ear/models rmeddis@0: option=get(handles.popupmenuEar,'value'); rmeddis@0: strings=get(handles.popupmenuEar,'string'); rmeddis@0: experiment.ear=strings{option}; rmeddis@0: rmeddis@0: switch experiment.ear rmeddis@0: case { 'MAPmodel', 'MAPmodelMultiCh', ... rmeddis@0: 'MAPmodelSingleCh', 'MAPmodelListen'} rmeddis@0: % MAPmodel writes forced parameter settings to the screen rmeddis@0: % so that they can be read from there rmeddis@0: set(handles.popupmenuRandomize,'value',2) % fixed sequence rmeddis@0: set(handles.editstimulusDelay,'string','0.01') % no stimulus delay rmeddis@0: stimulusParameters.includeCue=0; % no cue for MAP rmeddis@0: end rmeddis@0: rmeddis@0: % find tone type rmeddis@0: option=get(handles.popupmenuTargetType,'value'); rmeddis@0: strings=get(handles.popupmenuTargetType,'string'); rmeddis@0: stimulusParameters.targetType=strings{option}; rmeddis@0: rmeddis@0: % find masker type rmeddis@0: option=get(handles.popupmenuMaskerType,'value'); rmeddis@0: strings=get(handles.popupmenuMaskerType,'string'); rmeddis@0: stimulusParameters.maskerType=strings{option}; rmeddis@0: rmeddis@0: % find background type and level rmeddis@0: option=get(handles.popupmenuBackgroundType,'value'); rmeddis@0: strings=get(handles.popupmenuBackgroundType,'string'); rmeddis@0: stimulusParameters.backgroundTypeValue=option; rmeddis@0: stimulusParameters.backgroundLevel=... rmeddis@0: str2num(get(handles.editBackgroundLevel,'string')); rmeddis@0: stimulusParameters.backgroundType=strings{option}; rmeddis@0: rmeddis@0: % Read all stimulus parameter boxes rmeddis@0: for i=1:length(variableNames) rmeddis@0: cmd=['stimulusParameters.' variableNames{i} ... rmeddis@0: '= str2num(get(handles.edit' variableNames{i} ',''string'' ));']; rmeddis@0: eval(cmd); rmeddis@0: end rmeddis@0: % for multiple levels rmeddis@0: stimulusParameters.targetLevels=stimulusParameters.targetLevel; rmeddis@0: rmeddis@0: % check that all required values are in the edit boxes rmeddis@0: for i=1:length(variableNames)-3 % do not include 'level limits' rmeddis@0: eval([ 'variableValues=stimulusParameters.' variableNames{i} ';']) rmeddis@0: if isempty(variableValues), errorMsg=[ variableNames{i} ... rmeddis@0: ' is an empty box']; return, end rmeddis@0: end rmeddis@0: rmeddis@0: chosenOption=get(handles.popupmenuVaryParameter1,'value'); rmeddis@0: betweenRuns.variableName1=variableNames{chosenOption}; rmeddis@0: eval(['betweenRuns.variableList1 = stimulusParameters.' ... rmeddis@0: betweenRuns.variableName1 ';']); rmeddis@0: rmeddis@0: chosenOption=get(handles.popupmenuVaryParameter2,'value'); rmeddis@0: betweenRuns.variableName2=variableNames{chosenOption}; rmeddis@0: eval(['betweenRuns.variableList2 = stimulusParameters.' ... rmeddis@0: betweenRuns.variableName2 ';']); rmeddis@0: rmeddis@0: % Check that variable parameters 1 & 2 have different names rmeddis@0: if strcmp(betweenRuns.variableName1,betweenRuns.variableName2) ... rmeddis@0: && ~strcmp(betweenRuns.variableName1,'none') rmeddis@0: errorMsg='variable parameters have the same name'; rmeddis@0: return rmeddis@0: end rmeddis@0: rmeddis@0: % calibration rmeddis@0: % this is used to *reduce* the output signal from what it otherwise rmeddis@0: % would be rmeddis@0: % signal values are between 1 - 2^23 rmeddis@0: % these are interpreted as microPascals between -29 dB and 128 dB SPL rmeddis@0: % calibrationdB adjusts these values to compensate for equipment rmeddis@0: % characteristics rmeddis@0: % this will change the range. e.g. a 7 dB calibration will yield rmeddis@0: % a range of -36 to 121 dB SPL rmeddis@0: % Calibration is not used when modelling. Values are treated as dB SPL rmeddis@0: stimulusParameters.calibrationdB=... rmeddis@0: str2num(get(handles.editcalibrationdB,'string')); rmeddis@0: rmeddis@0: % check on cue rmeddis@0: cueSetUp(handles) rmeddis@0: rmeddis@0: stimulusParameters.WRVinitialStep=stimulusParameters.WRVsteps(1); rmeddis@0: stimulusParameters.WRVsmallStep=stimulusParameters.WRVsteps(2); rmeddis@0: rmeddis@0: % jitter start value set after reading in new parameters rmeddis@0: switch experiment.paradigm rmeddis@0: case 'discomfort' rmeddis@0: stimulusParameters.jitterStartdB=0; rmeddis@0: otherwise rmeddis@0: stimulusParameters.jitterStartdB=abs(stimulusParameters.WRVsteps(1)); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: % stats model mean and slope rmeddis@0: statsModelParameters= str2num(get(handles.editStatsModel,'string')); rmeddis@0: switch experiment.ear rmeddis@0: case {'statsModelLogistic'} rmeddis@0: statsModel.logisticMean=statsModelParameters(1) ; rmeddis@0: statsModel.logisticSlope=statsModelParameters(2); rmeddis@0: statsModel.rareEvenGain=NaN ; rmeddis@0: statsModel.rareEventVmin=NaN; rmeddis@0: case 'statsModelRareEvent' rmeddis@0: statsModel.logisticMean=NaN ; rmeddis@0: statsModel.logisticSlope=NaN; rmeddis@0: statsModel.rareEvenGain=statsModelParameters(2) ; rmeddis@0: statsModel.rareEventVmin=statsModelParameters(1); rmeddis@0: end rmeddis@0: rmeddis@0: % MAP plotting rmeddis@0: experiment.MAPplot=str2num(get(handles.editMAPplot,'string')); rmeddis@0: % if ~isequal(experiment.MAPplot, 0), rmeddis@0: % % any other character will do it rmeddis@0: % experiment.MAPplot=1; rmeddis@0: % end rmeddis@0: rmeddis@0: % save data rmeddis@0: experiment.saveData=str2num(get(handles.editSaveData,'string')); rmeddis@0: if ~isequal(experiment.saveData, 0), rmeddis@0: % any other character will do it rmeddis@0: experiment.saveData=1; rmeddis@0: end rmeddis@0: rmeddis@0: % print tracks rmeddis@0: experiment.printTracks=str2num(get(handles.editPrintTracks,'string')); rmeddis@0: if ~isequal(experiment.printTracks, 0), rmeddis@0: % any other character will do it rmeddis@0: experiment.printTracks=1; rmeddis@0: end rmeddis@0: rmeddis@0: % catch trial rate rmeddis@0: % (1)= start rate, (2)= base rate, (3)= time constant (trials) rmeddis@0: stimulusParameters.catchTrialRates=... rmeddis@0: str2num(get(handles.editCatchTrialRate,'string')); rmeddis@0: if stimulusParameters.catchTrialRates(1) ... rmeddis@0: < stimulusParameters.catchTrialRates(2) rmeddis@0: errorMsg=... rmeddis@0: 'catch trial base rates must be less than catch trial start rate'; rmeddis@0: return, rmeddis@0: end rmeddis@0: rmeddis@0: % sample rate rmeddis@0: % The sample rate is set in the paradigm file. rmeddis@0: % Normally this is set in the startUp paradigm file and then left rmeddis@0: % When the model is used, the multiThreshold sample rate rmeddis@0: % overrules anything in the model rmeddis@0: stimulusParameters.sampleRate=... rmeddis@0: str2num(get(handles.textsampleRate,'string')); rmeddis@0: rmeddis@0: % music level rmeddis@0: stimulusParameters.musicLeveldB=... rmeddis@0: str2num(get(handles.editMusicLevel,'string')); rmeddis@0: rmeddis@0: % set message box font size rmeddis@0: experiment.msgFontSize=str2num(get(handles.editMsgFont,'string')); rmeddis@0: experiment.subjGUIfontSize=str2num(get(handles.editSubjectFont,'string')); rmeddis@0: rmeddis@0: % stop criteria rmeddis@0: experiment.singleIntervalMaxTrials=... rmeddis@0: str2num(get(handles.editstopCriteriaBox,'string')); rmeddis@0: experiment.maxTrials=experiment.singleIntervalMaxTrials(1); rmeddis@0: rmeddis@0: % set up 2IFC is required (? better in atrhesholdAssessmentMethod) rmeddis@0: switch experiment.threshEstMethod rmeddis@0: case {'2I2AFC++', '2A2AIFC+++'} rmeddis@0: experiment.peaksUsed=experiment.singleIntervalMaxTrials(2); rmeddis@0: experiment.PeakTroughCriterionSD=... rmeddis@0: experiment.singleIntervalMaxTrials(3); rmeddis@0: experiment.trialsToBeUsed= 5; rmeddis@0: LevittControl.maxTrials=experiment.singleIntervalMaxTrials(1); rmeddis@0: % start value for step until reduced rmeddis@0: LevittControl.startLevelStep= stimulusParameters.WRVsteps(1); rmeddis@0: % reduced step size rmeddis@0: LevittControl.steadyLevittStep= stimulusParameters.WRVsteps(2); rmeddis@0: LevittControl.TurnsToSmallSteps= 2; rmeddis@0: LevittControl.useLastNturns= 2*experiment.peaksUsed; rmeddis@0: LevittControl.minReversals= ... rmeddis@0: LevittControl.TurnsToSmallSteps+2*experiment.peaksUsed; rmeddis@0: LevittControl.targetsdPT = experiment.PeakTroughCriterionSD; rmeddis@0: LevittControl.maxLevittValue= stimulusParameters.WRVlimits(2); rmeddis@0: Levitt2; rmeddis@0: end rmeddis@0: rmeddis@0: % What kind of randomisation is required? rmeddis@0: idx=get(handles.popupmenuRandomize,'value'); rmeddis@0: s=get(handles.popupmenuRandomize,'string'); rmeddis@0: betweenRuns.randomizeSequence=s{idx}; rmeddis@0: rmeddis@0: % Make small adjustments to variable values rmeddis@0: % to keep values unique against later sorting rmeddis@0: x=betweenRuns.variableList1; rmeddis@0: [y idx]= sort(x); rmeddis@0: for i=1:length(y)-1, if y(i+1)==y(i); y(i+1)=y(i)*1.001; end, end rmeddis@0: x(idx)=y; rmeddis@0: betweenRuns.variableList1=x; rmeddis@0: rmeddis@0: x=betweenRuns.variableList2; rmeddis@0: [y idx]= sort(x); rmeddis@0: for i=1:length(y)-1, if y(i+1)==y(i); y(i+1)=y(i)*1.001; end, end rmeddis@0: x(idx)=y; rmeddis@0: betweenRuns.variableList2=x; rmeddis@0: rmeddis@0: % Checks: after reading and setting parameters ------------------------------------------ rmeddis@0: % check for finger trouble (more checks possible rmeddis@0: if stimulusParameters.maskerDuration>10 rmeddis@0: errorMsg='maskerDuration is too long'; return, end rmeddis@0: if stimulusParameters.gapDuration>10 rmeddis@0: errorMsg='gapDuration is too long'; return, end rmeddis@0: if stimulusParameters.targetDuration>10 rmeddis@0: errorMsg='targetDuration is too long'; return, end rmeddis@0: rmeddis@0: % rare event slope check rmeddis@0: if experiment.psyFunSlope<0 ... rmeddis@0: && strcmp(experiment.functionEstMethod,'rareEvent') rmeddis@0: errorMsg='cannot use rareEvent option for negative psychometr slopes'; rmeddis@0: return rmeddis@0: end rmeddis@0: rmeddis@0: % check ramps rmeddis@0: if stimulusParameters.rampDuration*2> stimulusParameters.targetDuration rmeddis@0: errorMsg=' ramp duration is too long for the target'; rmeddis@0: return rmeddis@0: end rmeddis@0: rmeddis@0: if max(stimulusParameters.maskerDuration)>0 ... rmeddis@0: && max(stimulusParameters.rampDuration... rmeddis@0: *2> stimulusParameters.maskerDuration) rmeddis@0: errorMsg=' ramp duration is too long for the masker'; rmeddis@0: return rmeddis@0: end rmeddis@0: rmeddis@0: % Check WRVstartValues for length and compatibility with randomization rmeddis@0: % only one start value supplied so all start values are the same rmeddis@0: if length(stimulusParameters.WRVstartValues)==1 rmeddis@0: stimulusParameters.WRVstartValues= ... rmeddis@0: repmat(stimulusParameters.WRVstartValues, 1, ... rmeddis@0: length(betweenRuns.variableList1)... rmeddis@0: *length(betweenRuns.variableList2)); rmeddis@0: elseif ~isequal(length(stimulusParameters.WRVstartValues), ... rmeddis@0: length(betweenRuns.variableList1)... rmeddis@0: *length(betweenRuns.variableList2)) rmeddis@0: % otherwise we need one value for each combination of var1/ var2 rmeddis@0: errorMsg='WRVstartValues not the same length as number of runs'; rmeddis@0: return rmeddis@0: elseif strcmp(betweenRuns.randomizeSequence, 'randomize within blocks')... rmeddis@0: && length(stimulusParameters.WRVstartValues)>1 rmeddis@0: errorMsg='multiple WRVstartValues inappropriate'; rmeddis@0: return rmeddis@0: end rmeddis@0: rmeddis@0: switch experiment.paradigm rmeddis@0: % case { 'TMC', 'TMCmodel','IFMC'} rmeddis@0: case {'trainingIFMC', 'TMC','TMC_16ms', 'TMC - ELP', 'IFMC'} rmeddis@0: rmeddis@0: % For TMC and IFMC multiple target levels can be set rmeddis@0: if length(stimulusParameters.targetLevel)==1 rmeddis@0: betweenRuns.targetLevels=... rmeddis@0: repmat(stimulusParameters.targetLevel, 1, ... rmeddis@0: length(betweenRuns.variableList1)... rmeddis@0: *length(betweenRuns.variableList2)); rmeddis@0: elseif length(stimulusParameters.targetLevel)==... rmeddis@0: length(betweenRuns.variableList2) rmeddis@0: x=stimulusParameters.targetLevel; rmeddis@0: x=repmat(x,length(betweenRuns.variableList1),1); rmeddis@0: x=reshape(x,1,length(betweenRuns.variableList1)*length(betweenRuns.variableList2)); rmeddis@0: betweenRuns.targetLevels=x; rmeddis@0: else rmeddis@0: errorMsg='targetLevels not the same length as number of targetFrequencies'; rmeddis@0: end rmeddis@0: end rmeddis@0: rmeddis@0: switch experiment.paradigm rmeddis@0: case {'gapDetection', 'frequencyDiscrimination'} rmeddis@0: if ~isequal(stimulusParameters.targetDuration, ... rmeddis@0: stimulusParameters.maskerDuration) rmeddis@0: addToMsg(... rmeddis@0: 'Warning: masker and target duration not the same.',1,1) rmeddis@0: end rmeddis@0: if ~isequal(stimulusParameters.maskerLevel, ... rmeddis@0: stimulusParameters.targetLevel) rmeddis@0: addToMsg(['Warning: masker and target level different.'... rmeddis@0: 'They will be changed to be equal',1,1]); rmeddis@0: end rmeddis@0: end rmeddis@0: rmeddis@0: % -------------------------------------------- aSetSampleRate rmeddis@0: function aSetSampleRate(sampleRate, handles) rmeddis@0: global stimulusParameters rmeddis@0: stimulusParameters.sampleRate=sampleRate; rmeddis@0: set(handles.textsampleRate,'string',num2str(stimulusParameters.sampleRate)) rmeddis@0: rmeddis@0: % -------------------------------------------- popupmenuEar_Callback rmeddis@0: function popupmenuEar_Callback(hObject, eventdata, handles) rmeddis@0: global experiment rmeddis@0: option=get(handles.popupmenuEar,'value'); rmeddis@0: options=get(handles.popupmenuEar,'string'); % left/right/model rmeddis@0: experiment.ear=options{option}; rmeddis@0: switch experiment.ear rmeddis@0: case 'statsModelLogistic' rmeddis@0: set(handles.editStatsModel,'string', '15, 0.5') rmeddis@0: case 'statsModelRareEvent' rmeddis@0: set(handles.editStatsModel,'string', '20 1') rmeddis@0: end rmeddis@0: earSetUp(handles) rmeddis@0: rmeddis@0: % -------------------------------------------- earSetUp rmeddis@0: function earSetUp(handles) rmeddis@0: global experiment stimulusParameters rmeddis@0: % option=get(handles.popupmenuEar,'value'); rmeddis@0: % options=get(handles.popupmenuEar,'string'); % left/right/model rmeddis@0: % experiment.ear=options{option}; rmeddis@0: rmeddis@0: switch experiment.ear rmeddis@0: case {'statsModelLogistic'} rmeddis@0: statsModel.logisticSlope=0.5; rmeddis@0: statsModel.logisticMean=15; rmeddis@0: set(handles.editStatsModel,'string', ... rmeddis@0: num2str([statsModel.logisticMean statsModel.logisticSlope])) rmeddis@0: set(handles.textStatsModel,... rmeddis@0: 'string', {'statsModel',' logistic threshold\ slope'}) rmeddis@0: case 'statsModelRareEvent' rmeddis@0: set(handles.textStatsModel,'string', ... rmeddis@0: {'statsModel',' rareEvent Vmin\ gain'}) rmeddis@0: end rmeddis@0: rmeddis@0: switch experiment.ear rmeddis@0: case {'statsModelLogistic', 'statsModelRareEvent'} rmeddis@0: set(handles.editStatsModel, 'visible', 'off') rmeddis@0: set(handles.textStatsModel, 'visible', 'off') rmeddis@0: rmeddis@0: % default psychometric bin size and logistic slopes rmeddis@0: set(handles.popupmenuRandomize,'value',2) % fixed sequence rmeddis@0: set(handles.editName,'string', 'statsModel') rmeddis@0: % experiment.headphonesUsed=0; rmeddis@0: rmeddis@0: case {'MAPmodelListen', 'MAPmodelMultiCh', 'MAPmodelSingleCh'} rmeddis@0: stimulusParameters.includeCue=0; % no cue rmeddis@0: set(handles.popupmenuCueNoCue,'value', 2) rmeddis@0: rmeddis@0: set(handles.editCatchTrialRate,'string','0 0 2 ');%no catch trials rmeddis@0: set(handles.editName,'string', 'Normal') % force name rmeddis@0: experiment.name=get(handles.editName,'string'); % read name back rmeddis@0: set(handles.editcalibrationdB,'string','0') rmeddis@0: rmeddis@0: set(handles.popupmenuRandomize,'value',2) % fixed sequence rmeddis@0: set(handles.editstimulusDelay,'string','0') rmeddis@0: rmeddis@0: set(handles.editSaveData,'string', '0') rmeddis@0: set(handles.editSubjectFont,'string', '10'); rmeddis@0: experiment.MacGThreshold=0; % num MacG spikes to exceed threshold rmeddis@0: end rmeddis@0: aResetPopupMenus(handles) rmeddis@0: rmeddis@0: % --------------------------------------------- popupmenuCueNoCue_Callback rmeddis@0: function popupmenuCueNoCue_Callback(hObject, eventdata, handles) rmeddis@0: cueSetUp(handles) rmeddis@0: rmeddis@0: % ------------------------------------------------------------- cueSetUp rmeddis@0: function cueSetUp(handles) rmeddis@0: global stimulusParameters rmeddis@0: rmeddis@0: chosenOption=get(handles.popupmenuCueNoCue,'value'); rmeddis@0: if chosenOption==1 rmeddis@0: stimulusParameters.includeCue=1; rmeddis@0: set(handles.editcueTestDifference,'visible', 'on') rmeddis@0: set(handles.textcueTestDifference,'visible', 'on') rmeddis@0: stimulusParameters.subjectText=stimulusParameters.instructions{2}; rmeddis@0: else rmeddis@0: stimulusParameters.includeCue=0; rmeddis@0: set(handles.editcueTestDifference,'visible', 'off') rmeddis@0: set(handles.textcueTestDifference,'visible', 'off') rmeddis@0: stimulusParameters.subjectText= stimulusParameters.instructions{1}; rmeddis@0: end rmeddis@0: rmeddis@0: % -------------------------------------------- popupmenuThreshEst_Callback rmeddis@0: function popupmenuThreshEst_Callback(hObject, eventdata, handles) rmeddis@0: aThresholdAssessmentMethod(handles); rmeddis@0: rmeddis@0: % --------------------------------------------- aThresholdAssessmentMethod rmeddis@0: function aThresholdAssessmentMethod(handles) rmeddis@0: % identify the threshold assessment method rmeddis@0: % and set various parameters on the GUI appropriately rmeddis@0: global stimulusParameters experiment threshEstNames LevittControl rmeddis@0: rmeddis@0: chosenOption=get(handles.popupmenuThreshEst,'value'); rmeddis@0: experiment.threshEstMethod=threshEstNames{chosenOption}; rmeddis@0: set(handles.editCatchTrialRate, 'visible', 'on') rmeddis@0: set(handles.textCatchTrials, 'visible', 'on') rmeddis@0: rmeddis@0: % establish appropriate stop criterion and post on GUI rmeddis@0: switch experiment.threshEstMethod rmeddis@0: case 'MaxLikelihood' rmeddis@0: experiment.functionEstMethod='logisticML'; rmeddis@0: stimulusParameters.WRVsteps=10*experiment.psyFunSlope; % ??? rmeddis@0: set(handles.textstopCriteria,'string', 'stop criteria \ maxTrials') rmeddis@0: experiment.singleIntervalMaxTrials=experiment.stopCriteriaSI; rmeddis@0: experiment.allowCatchTrials= 1; rmeddis@0: switch experiment.paradigm rmeddis@0: case 'training' rmeddis@0: experiment.possLogSlopes=0.5; rmeddis@0: end rmeddis@0: rmeddis@0: case 'oneIntervalUpDown' rmeddis@0: experiment.functionEstMethod='logisticLS'; rmeddis@0: set(handles.textstopCriteria,'string', 'stop criteria \ maxTrials') rmeddis@0: experiment.singleIntervalMaxTrials=experiment.stopCriteriaSI; rmeddis@0: switch experiment.paradigm rmeddis@0: case 'discomfort' rmeddis@0: experiment.allowCatchTrials= 0; rmeddis@0: otherwise rmeddis@0: experiment.allowCatchTrials= 1; rmeddis@0: end rmeddis@0: rmeddis@0: case {'2I2AFC++', '2I2AFC+++'} rmeddis@0: LevittControl.rule='++'; % e.g. '++' or '+++' rmeddis@0: experiment.singleIntervalMaxTrials=experiment.stopCriteria2IFC; rmeddis@0: experiment.functionEstMethod='peaksAndTroughs'; rmeddis@0: LevittControl.maxTrials=experiment.singleIntervalMaxTrials(1); rmeddis@0: set(handles.editWRVsteps,'string', ... rmeddis@0: num2str(stimulusParameters.WRVsteps)) rmeddis@0: set(handles.textstopCriteria,'string', {'trials peaks sdCrit'}) rmeddis@0: experiment.allowCatchTrials= 0; rmeddis@0: end rmeddis@0: rmeddis@0: set(handles.textstopCriteria,'fontSize',8) rmeddis@0: set(handles.editstopCriteriaBox,'string',... rmeddis@0: num2str(experiment.singleIntervalMaxTrials)) rmeddis@0: rmeddis@0: % establish the appropriate instructions to the subject rmeddis@0: % NB responsibility for this is now transferred to the paradigm file rmeddis@0: switch experiment.threshEstMethod rmeddis@0: % only one value required for level change rmeddis@0: case {'2I2AFC++', '2A2AIFC+++'} rmeddis@0: stimulusParameters.subjectText=... rmeddis@0: 'did the tone occur in window 1 or 2?'; rmeddis@0: case {'MaxLikelihood', 'oneIntervalUpDown'}; rmeddis@0: switch stimulusParameters.includeCue rmeddis@0: case 0 rmeddis@0: stimulusParameters.subjectText=... rmeddis@0: stimulusParameters.instructions{1}; rmeddis@0: case 1 rmeddis@0: stimulusParameters.subjectText= ... rmeddis@0: stimulusParameters.instructions{2}; rmeddis@0: end rmeddis@0: end rmeddis@0: stimulusParameters.messageString={'training'}; rmeddis@0: rmeddis@0: aResetPopupMenus(handles) rmeddis@0: % -------------------------------------------------- function orderGlobals rmeddis@0: function orderGlobals rmeddis@0: global stimulusParameters experiment betweenRuns withinRuns rmeddis@0: rmeddis@0: stimulusParameters=[]; rmeddis@0: stimulusParameters.sampleRate= []; rmeddis@0: stimulusParameters.targetType= ''; rmeddis@0: stimulusParameters.targetFrequency= []; rmeddis@0: stimulusParameters.targetDuration= []; rmeddis@0: stimulusParameters.targetLevel= []; rmeddis@0: stimulusParameters.gapDuration= []; rmeddis@0: stimulusParameters.maskerType= ''; rmeddis@0: stimulusParameters.maskerRelativeFrequency= []; rmeddis@0: stimulusParameters.maskerDuration= []; rmeddis@0: stimulusParameters.maskerLevel= []; rmeddis@0: stimulusParameters.backgroundType= ''; rmeddis@0: stimulusParameters.backgroundTypeValue= []; rmeddis@0: stimulusParameters.backgroundLevel= []; rmeddis@0: stimulusParameters.includeCue= []; rmeddis@0: experiment.clickToStimulusPause=[]; rmeddis@0: stimulusParameters.stimulusDelay= []; rmeddis@0: stimulusParameters.rampDuration= []; rmeddis@0: stimulusParameters.absThresholds= []; rmeddis@0: stimulusParameters.numOHIOtones= []; rmeddis@0: rmeddis@0: stimulusParameters.WRVname= ''; rmeddis@0: stimulusParameters.WRVstartValues= []; rmeddis@0: stimulusParameters.WRVsteps= []; rmeddis@0: stimulusParameters.WRVlimits= []; rmeddis@0: stimulusParameters.WRVinitialStep= []; rmeddis@0: stimulusParameters.WRVsmallStep= []; rmeddis@0: experiment.singleIntervalMaxTrials= []; rmeddis@0: stimulusParameters.calibrationdB= []; rmeddis@0: rmeddis@0: stimulusParameters.catchTrialRates= []; rmeddis@0: stimulusParameters.catchTrialBaseRate= []; rmeddis@0: stimulusParameters.catchTrialRate= []; rmeddis@0: stimulusParameters.catchTrialTimeConstant= []; rmeddis@0: rmeddis@0: stimulusParameters.dt= []; rmeddis@0: rmeddis@0: stimulusParameters.jitterStartdB= []; rmeddis@0: stimulusParameters.restoreCalibration= []; rmeddis@0: stimulusParameters.messageString= []; rmeddis@0: stimulusParameters.cueTestDifference= []; rmeddis@0: stimulusParameters.subjectText= ''; rmeddis@0: stimulusParameters.testTargetBegins= []; rmeddis@0: stimulusParameters.testTargetEnds= []; rmeddis@0: stimulusParameters.musicLeveldB= []; rmeddis@0: rmeddis@0: stimulusParameters.subjectSampleRate=[]; rmeddis@0: stimulusParameters.MAPSampleRate=[]; rmeddis@0: rmeddis@0: experiment=[]; rmeddis@0: experiment.name= ''; rmeddis@0: experiment.date= ''; rmeddis@0: experiment.paradigm= ''; rmeddis@0: experiment.ear= ''; rmeddis@0: experiment.headphonesUsed=[]; rmeddis@0: experiment.singleShot= []; rmeddis@0: experiment.randomize= ''; rmeddis@0: experiment.maxTrials= []; rmeddis@0: experiment.MacGThreshold= []; rmeddis@0: experiment.resetCriterion= []; rmeddis@0: experiment.runResetCriterion= []; rmeddis@0: rmeddis@0: experiment.comparisonData= []; rmeddis@0: experiment.absThresholds= []; rmeddis@0: experiment.threshEstMethod= ''; rmeddis@0: experiment.functionEstMethod= ''; rmeddis@0: experiment.psyBinWidth= []; rmeddis@0: experiment.maxLogisticK=2; rmeddis@0: experiment.numPossLogisticK=100; rmeddis@0: experiment.possLogSlopes= []; rmeddis@0: experiment.meanSearchStep= []; rmeddis@0: experiment.psyFunSlope= []; rmeddis@0: experiment.predictionLevels=[]; rmeddis@0: rmeddis@0: experiment.buttonBoxType= ''; rmeddis@0: experiment.buttonBoxStatus= ''; rmeddis@0: experiment.status= ''; rmeddis@0: experiment.stop= 0; rmeddis@0: experiment.pleaseRepeat= []; rmeddis@0: experiment.justInitialized=[]; rmeddis@0: rmeddis@0: experiment.MAPplot= []; rmeddis@0: experiment.saveData= []; rmeddis@0: experiment.printTracks= []; rmeddis@0: experiment.msgFontSize= []; rmeddis@0: experiment.subjGUIfontSize= []; rmeddis@0: rmeddis@0: experiment.timeAtStart= ''; rmeddis@0: experiment.minElapsed= []; rmeddis@0: rmeddis@0: betweenRuns=[]; rmeddis@0: betweenRuns.variableName1= ''; rmeddis@0: betweenRuns.variableList1= []; rmeddis@0: betweenRuns.variableName2= ''; rmeddis@0: betweenRuns.variableList2= []; rmeddis@0: betweenRuns.var1Sequence= []; rmeddis@0: betweenRuns.var2Sequence= []; rmeddis@0: betweenRuns.randomizeSequence=[]; rmeddis@0: betweenRuns.timeNow= []; rmeddis@0: betweenRuns.runNumber= []; rmeddis@0: % betweenRuns.variableCount1= []; rmeddis@0: % betweenRuns.variableCount2= []; rmeddis@0: betweenRuns.thresholds= []; rmeddis@0: betweenRuns.forceThresholds= []; rmeddis@0: betweenRuns.observationCount= []; rmeddis@0: betweenRuns.timesOfFirstReversals= []; rmeddis@0: betweenRuns.bestThresholdTracks=''; rmeddis@0: betweenRuns.bestThresholdMeanTracks=''; rmeddis@0: betweenRuns.bestThresholdMedianTracks=''; rmeddis@0: betweenRuns.levelTracks=''; rmeddis@0: betweenRuns.responseTracks=''; rmeddis@0: betweenRuns.slopeKTracks= []; rmeddis@0: betweenRuns.gainTracks= []; rmeddis@0: betweenRuns.VminTracks= []; rmeddis@0: betweenRuns.bestGain= []; rmeddis@0: betweenRuns.bestVMin= []; rmeddis@0: betweenRuns.bestPaMin= []; rmeddis@0: betweenRuns.bestLogisticM= []; rmeddis@0: betweenRuns.bestLogisticK= []; rmeddis@0: betweenRuns.psychometicFunction=''; rmeddis@0: betweenRuns.catchTrials= []; rmeddis@0: betweenRuns.caughtOut= []; rmeddis@0: rmeddis@0: withinRuns=[]; rmeddis@0: withinRuns.trialNumber=[]; rmeddis@0: withinRuns.nowInPhase2=0; rmeddis@0: withinRuns.beginningOfPhase2=0; rmeddis@0: withinRuns.variableValue=[]; rmeddis@0: withinRuns.direction=''; rmeddis@0: withinRuns.peaks=[]; rmeddis@0: withinRuns.troughs= []; rmeddis@0: withinRuns.levelList= []; rmeddis@0: withinRuns.responseList= []; rmeddis@0: withinRuns.meanEstTrack= []; rmeddis@0: withinRuns.meanLogisticEstTrack=[]; rmeddis@0: withinRuns.bestSlopeK= []; rmeddis@0: withinRuns.bestGain= []; rmeddis@0: withinRuns.bestVMin= []; rmeddis@0: withinRuns.forceThreshold=[]; rmeddis@0: withinRuns.catchTrial= []; rmeddis@0: withinRuns.caughtOut=[]; rmeddis@0: withinRuns.catchTrialCount=[]; rmeddis@0: withinRuns.wrongButton= []; rmeddis@0: withinRuns.babblePlaying=0; rmeddis@0: rmeddis@0: % --- Executes on selection change in popupmenuBackgroundType. rmeddis@0: function popupmenuBackgroundType_Callback(hObject, eventdata, handles) rmeddis@0: global backgroundTypes rmeddis@0: option=get(handles.popupmenuBackgroundType,'value'); rmeddis@0: selectedBackground=backgroundTypes{option}; rmeddis@0: stimulusParameters.backgroundType=selectedBackground; rmeddis@0: rmeddis@0: switch selectedBackground rmeddis@0: case 'none' rmeddis@0: set(handles.editBackgroundLevel,'visible','off') rmeddis@0: set(handles.textBGlevel,'visible','off') rmeddis@0: otherwise rmeddis@0: set(handles.editBackgroundLevel,'visible','on') rmeddis@0: set(handles.textBGlevel,'visible','on') rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@0: function pushbuttonStop_Callback(hObject, eventdata, handles) rmeddis@0: global experiment rmeddis@0: experiment.stop=1; rmeddis@0: disp('stop!') rmeddis@0: set(handles.pushbuttonStop, 'backgroundColor','r') rmeddis@0: pause(.1) rmeddis@0: drawnow rmeddis@0: rmeddis@0: function pushbuttonOME_Callback(hObject, eventdata, handles) rmeddis@0: aReadAndCheckParameterBoxes(handles); rmeddis@0: testOME rmeddis@0: rmeddis@0: function pushbuttonBM_Callback(hObject, eventdata, handles) rmeddis@0: global stimulusParameters experiment rmeddis@0: aReadAndCheckParameterBoxes(handles); rmeddis@0: testBM(stimulusParameters.targetFrequency, experiment.name); rmeddis@0: rmeddis@0: function pushbuttonAN_Callback(hObject, eventdata, handles) rmeddis@0: aReadAndCheckParameterBoxes(handles); rmeddis@0: % now carry out tests rmeddis@0: showPSTHs=0; rmeddis@0: testAN rmeddis@0: rmeddis@0: function pushbuttonRF_Callback(hObject, eventdata, handles) rmeddis@0: aReadAndCheckParameterBoxes(handles); rmeddis@0: showPSTHs=1; rmeddis@0: testRF rmeddis@0: rmeddis@0: function pushbuttonSYN_Callback(hObject, eventdata, handles) rmeddis@0: aReadAndCheckParameterBoxes(handles); rmeddis@0: testSynapse rmeddis@0: rmeddis@0: function pushbuttonFM_Callback(hObject, eventdata, handles) rmeddis@0: aReadAndCheckParameterBoxes(handles); rmeddis@0: testFM rmeddis@0: rmeddis@0: function popupmenuPhase_Callback(hObject, eventdata, handles) rmeddis@0: global stimulusParameters rmeddis@0: rmeddis@0: optionNo=get(handles.popupmenuPhase,'value'); rmeddis@0: options=get(handles.popupmenuPhase,'string'); rmeddis@0: phase=options{optionNo}; rmeddis@0: stimulusParameters.maskerPhase=phase; rmeddis@0: stimulusParameters.targetPhase=phase; rmeddis@0: rmeddis@0: function pushbuttonParams_Callback(hObject, eventdata, handles) rmeddis@0: global experiment stimulusParameters rmeddis@0: aReadAndCheckParameterBoxes(handles); rmeddis@0: % print model parameters using the 'name' box (e.g. CTa -> MAPparamsCTa) rmeddis@0: showParams=1; BFlist=-1; rmeddis@0: paramFunctionName=['method=MAPparams' experiment.name ... rmeddis@0: '(BFlist, stimulusParameters.sampleRate, showParams);']; rmeddis@0: eval(paramFunctionName) % go and fetch the parameters requesting parameter printout rmeddis@0: rmeddis@0: rmeddis@0: % --- Executes on button press in pushbuttonRP. rmeddis@0: function pushbuttonRP_Callback(hObject, eventdata, handles) rmeddis@0: global experiment stimulusParameters rmeddis@0: aReadAndCheckParameterBoxes(handles); rmeddis@0: % now carry out test rmeddis@0: testRP(stimulusParameters.targetFrequency,experiment.name) rmeddis@0: rmeddis@0: % function handles % ?? rmeddis@0: rmeddis@0: rmeddis@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@0: rmeddis@0: function editmaskerDuration_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editmaskerDuration_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editmaskerLevel_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editmaskerLevel_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editmaskerRelativeFrequency_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editmaskerRelativeFrequency_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editWRVstartValues_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editWRVstartValues_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editgapDuration_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editgapDuration_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function edittargetDuration_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function edittargetDuration_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function edittargetLevel_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function edittargetLevel_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editrampDuration_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editrampDuration_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editcueTestDifference_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editcueTestDifference_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: function editWRVsteps_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editWRVsteps_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editWRVlimits_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editWRVlimits_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function edittargetFrequency_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function edittargetFrequency_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editName_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editName_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editcalibrationdB_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editcalibrationdB_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editMAPplot_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editMAPplot_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editMsgFont_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editMsgFont_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editCatchTrialRate_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editCatchTrialRate_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: function editSaveData_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editSaveData_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editStatsModel_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editStatsModel_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editBackgroundLevel_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editBackgroundLevel_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editPrintTracks_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editPrintTracks_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editstopCriteriaBox_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editstopCriteriaBox_CreateFcn(hObject, eventdata, handles) rmeddis@0: rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editstimulusDelay_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editstimulusDelay_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: function popupmenuCueNoCue_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function popupmenuEar_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','red'); rmeddis@0: end rmeddis@0: rmeddis@0: function popupmenuVaryParameter1_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function popupmenuVaryParameter1_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function popupmenuVaryParameter2_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function popupmenuVaryParameter2_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function popupmenuRandomize_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function popupmenuRandomize_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function popupmenuParadigm_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: function popupmenuMaskerType_CreateFcn(hObject, eventdata, handles) rmeddis@0: rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: function popupmenuThreshEst_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function popupmenuBackgroundType_CreateFcn(hObject, eventdata, handles) rmeddis@0: rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: function popupmenuTargetType_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editSubjectFont_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editSubjectFont_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editMusicLevel_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editMusicLevel_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function figure1_ButtonDownFcn(hObject, eventdata, handles) rmeddis@0: rmeddis@0: rmeddis@0: function edit33_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function edit33_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: function popupmenuPhase_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: function editsegSize_Callback(hObject, eventdata, handles) rmeddis@0: rmeddis@0: function editsegSize_CreateFcn(hObject, eventdata, handles) rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: function editnumOHIOtones_Callback(hObject, eventdata, handles) rmeddis@0: % hObject handle to editnumOHIOtones (see GCBO) rmeddis@0: % eventdata reserved - to be defined in a future version of MATLAB rmeddis@0: % handles structure with handles and user data (see GUIDATA) rmeddis@0: rmeddis@0: % Hints: get(hObject,'String') returns contents of editnumOHIOtones as text rmeddis@0: % str2double(get(hObject,'String')) returns contents of editnumOHIOtones as a double rmeddis@0: rmeddis@0: rmeddis@0: % --- Executes during object creation, after setting all properties. rmeddis@0: function editnumOHIOtones_CreateFcn(hObject, eventdata, handles) rmeddis@0: % hObject handle to editnumOHIOtones (see GCBO) rmeddis@0: % eventdata reserved - to be defined in a future version of MATLAB rmeddis@0: % handles empty - handles not created until after all CreateFcns called rmeddis@0: rmeddis@0: % Hint: edit controls usually have a white background on Windows. rmeddis@0: % See ISPC and COMPUTER. rmeddis@0: if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) rmeddis@0: set(hObject,'BackgroundColor','white'); rmeddis@0: end rmeddis@0: rmeddis@0: rmeddis@0: