function varargout = behavior3(varargin) % behavior3( FILENAME, METHOD, HANDEDNESS, NUM_TRIALS); % % Takes the following arguments: % % Required: % FILENAME - Name of file to store the results from this experiment in: % e.g. 'blah' will store the variables choices and rewards into blah.mat % % METHOD - Must be either 1, 2, or 3. Will specify the form of the reward % schedule presented under this trial % % HANDEDNESS - Must be either 'l' or 'r', corresponding to left or % right-handed. Specifies the dominant hand of the subject, and dictates % whether the keys "x" and "c" are used (left-handed), or the keys "," and % "." are used (right-handed) % % Optional: % NUM_TRIALS - Specifies the number of trials to run. If left unspecified, % the default is 20. % % Examples: % Typically, you will ask the subject if they are left or right-handed. If % they are right-handed, you might run the following experiments % % >> behavior3('subject1_exp1_method1', 1, 'r', 240); % >> behavior3('subject1_exp2_method2', 2, 'r', 240); % >> behavior3('subject1_exp3_method3', 3, 'r', 240); % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @behavior3_OpeningFcn, ... 'gui_OutputFcn', @behavior3_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin & isstr(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before behavior3 is made visible. function behavior3_OpeningFcn(hObject, eventdata, handles, varargin) global CHOICES; global REWARDS; global ALLOCATIONS; global A; global B; global NUM_TRIALS; global key_A; global key_B; global METHOD; CHOICES = []; REWARDS = []; ALLOCATIONS = 20; % Choose default command line output for behavior3 handles.output = hObject; % Update handles structure guidata(hObject, handles); if nargin < 4, disp('You need to specify a filename and method and dominant hand'); error('Unspecified filename'); elseif nargin < 5, disp('You need to specify a method and dominant hand'); error('Unspecified method'); elseif nargin < 6, disp('You need to specify a dominant hand'); error('Unspecified handedness'); else filename = varargin{1}; METHOD = varargin{2}; hand = varargin{3}; end; if METHOD ~= 1:3, error('Wrong method type'); end; if hand == 'l', key_A = 'x'; key_B = 'c'; elseif hand =='r', key_A = ','; key_B = '.'; else disp('dominant hand must be either l or r'); error('Wrong handedness'); end if nargin>6, NUM_TRIALS = varargin{4}; else, NUM_TRIALS = 20; end; set(hObject, 'keypressfcn', {@keystart, handles, filename}); set(handles.text1, 'string', ['Press keys "' upper(key_A) '" and "' upper(key_B) '" to maximize reward. Press Y when ready']); set(handles.axes1, 'xtick', [], 'ytick', [0 1], 'yticklabel', ['Min';'Max'], 'fontsize', 14); set(handles.axes2, 'xtick', [], 'ytick', linspace(0,1,10), 'yticklabel', 0:9, 'fontsize', 14, 'box', 'on'); % --- Outputs from this function are returned to the command line. function varargout = behavior3_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function keycallback(hObject, eventdata, handles, filename) global CHOICES; global REWARDS; global key_A; global key_B; global NUM_TRIALS; d = get(hObject, 'currentcharacter'); if d==key_A, CHOICES = [1 CHOICES]; elseif d==key_B, CHOICES = [0 CHOICES]; else, set(handles.text1, 'string', ['Incorrect key press, use ' upper(key_A) ' and ' upper(key_B) '.']); return; end; set(handles.text1, 'string', ['Reward computing']); pause(0.25); reward = reward_func; REWARDS = [reward REWARDS]; if length(CHOICES)0))>length(find((sum(REWARDS(2:end))-linspace(0,240,10))>0)))&&(length(REWARDS)>2) set(handles.text1, 'string', 'Milestone achieved! Please ask for your candy, then press Y to continue...'); axes(handles.axes1); bar(0.5, REWARDS(1), 0.2, 'g'); set(handles.axes1, 'xtick', [], 'ytick', [0 1], 'yticklabel', ['Min';'Max'], 'fontsize', 14); xlim([0 1]); ylim([0 1]); axes(handles.axes2); bar(0.5, sum(REWARDS), 0.2, 'g'); set(handles.axes2, 'xtick', [], 'ytick', linspace(0, NUM_TRIALS, 10), 'yticklabel', 0:9, 'fontsize', 14, 'box', 'on'); xlim([0 1]); ylim([0 NUM_TRIALS]); set(hObject, 'keypressfcn', {@keyreward, handles, filename}); end else, axes(handles.axes1); bar(0.5, 0, 0.2, 'r'); xlim([0 1]); ylim([0 1]); set(handles.axes1, 'xtick', [], 'ytick', [0 1], 'yticklabel', ['Min';'Max'], 'fontsize', 14); set(handles.text1, 'string', [int2str(length(CHOICES)) ' All Done, Press Q to exit.']); set(hObject, 'keypressfcn', {@keyexit, handles}); rewards = fliplr(REWARDS); choices = fliplr(CHOICES); save(filename, 'choices', 'rewards'); end; function keystart(hObject, eventdata, handles, filename) if get(hObject, 'currentcharacter')=='y', set(hObject, 'keypressfcn', {@keycallback, handles, filename}); set(handles.text1, 'string', [int2str(0) ' Trials Completed']); set(handles.axes1, 'xtick', [], 'ytick', [0 1], 'yticklabel', ['Min';'Max'], 'fontsize', 14); set(handles.axes2, 'xtick', [], 'ytick', linspace(0,1,10), 'yticklabel', 0:9, 'fontsize', 14, 'box', 'on'); end; function keyreward(hObject, eventdata, handles, filename) global CHOICES; if get(hObject, 'currentcharacter')=='y', set(hObject, 'keypressfcn', {@keycallback, handles, filename}); set(handles.text1, 'string', [int2str(sum(CHOICES)) ' Trials Completed']); end; function keyexit(hObject, eventdata, handles) if get(hObject, 'currentcharacter')=='q', close(hObject); end; function reward = reward_func() global METHOD; global CHOICES; global BUFFER; if length(CHOICES)==1, BUFFER = 0.5*ones(1,40); end; BUFFER = [CHOICES(1) BUFFER(1:39)]; x = mean(BUFFER); BUFFER = x*ones(1,40); switch METHOD case 1 A = [linspace(.7, .2, 240) linspace(0.24, 0.8, 160)]; B = [linspace(0.6,0.2, 160) linspace(0.24, .5, 80) 0.2*ones(1, 160)]; case 2 B = [linspace(.7, .2, 260) linspace(0.24, 0.8, 140)]; A = [linspace(0.6,0.2, 140) linspace(0.24, .5, 120) 0.2*ones(1, 140)]; case 3 A = [linspace(.7, .2, 280) linspace(0.24, 0.8, 120)]; B = [linspace(0.6,0.2, 120) linspace(0.24, .5, 160) 0.2*ones(1, 120)]; end if CHOICES(1), reward = A(median([1 round(400*x) 400])); else reward = B(median([1 round(400*x) 400])); end