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