%fratxPub1. Copyright (C) 2011 Franklin B. Krasne. %This file is free software; you can redistribute it and/or modify it under the terms of the GNU General %Public License as published by the Free Software Foundation; either version 3 of the License, or (at your %option) any later version. %This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the %implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %See the GNU General Public License for more details. You should have received a copy of the GNU General %Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA %02111-1307, USA. %[Author note to himself:This is an annotated version of the program %(fratx327.m)used to do simulations for Krasne et al (2011). Its immediate progenitor is fratxWEBd.m %which is a cleaned up version of the programs used for the simulations.] % BRIEF TABLE OF CONTENTS % Lines numbers are those shown when the program % is opened in the Matlab Editor %Line number -- <103 is Matlab code for GUI setup % 103 Introductory text followed by preliminaries related to display, graphing, etc. % 170 Parameters values and variable initialization. % 354 Function run_continue % 1177 Special events called from GUI (e.g. Hx, Hs, consolidate, etc). % 1300 Functions used by other routines % 1331 Reset Experiment, Reset (New Fraidy), Quit, Intialize Fraidy. % 1464 Various untilities. Including in order: Replot/Animate, SSdone (make % Exp array from short method of scheduling), Various functions used in short % scheduling method, Make (i.e. load) Long Schedule (i.e. externally written % Exp array written as Excel text tab-delimited text file), goKeyboard, and % routines to familiarize FRAT to contexts without explicitly writing suitable % experience into experimental schedules. % 2314 Various functions written by Matlab to initialize GUI controls. %The following is code generated by Matlab for the GUI (Some of the %uicontrol setup stuff is placed at the end of the program): function varargout = fratxPub1(varargin) %FRATXPUB1 M-file for fratxPub1.fig % FRATXPUB1, by itself, creates a new FRATXPUB1 or raises the existing % singleton*.% % H = FRATXPUB1 returns the handle to a new FRATXPUB1 or the handle to % the existing singleton*. % FRATXPUB1('Property','Value',...) creates a new FRATXPUB1 using the % given property value pairs. Unrecognized properties are passed via % varargin to fratxPub1_OpeningFcn. This calling syntax produces a % warning when there is an existing singleton*. % FRATXPUB1('CALLBACK') and FRATXPUB1('CALLBACK',hObject,...) call the % local function named CALLBACK in FRATXPUB1.M with the given input % arguments. % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help fratxPub1 % Last Modified by GUIDE v2.5 02-Nov-2011 12:01:47 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @fratxPub1_OpeningFcn, ... 'gui_OutputFcn', @fratxPub1_OutputFcn, ... 'gui_LayoutFcn', [], ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before fratxPub1 is made visible. function fratxPub1_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin unrecognized PropertyName/PropertyValue pairs from the % command line (see VARARGIN) % Choose default command line output for fratxPub1 handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes fratxPub1 wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = fratxPub1_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; %%%%%%%%%%%%%%%%%%%%END OF MATLAB-GENERATED CODE%%%%%%%%%%%%%%%%%%%%%%%% %Preliminaries related to graphing, display, etc % The code above is all code generated by Matlab to program the GUI, which %was constructed using the editor provided for that purpose by Matlab. The %code written by the Author is all below this point. Some of this code is %for various utilities such as a routine for constructing the schedule for %running experiments, whereas othe code is the implemntation of the model %described in Krasne, Fanselow, and Zelikowsky (2011). % A table of contents giving line numbers appears at the start of the program. %An attempt has been made to %provide some explanation of the code for the model proper here within the program. It is %presumed that it is this code that readers may wish to alter for their own %purposes. The utility code is not internally documented and it has not been %cleaned up for external consumption. % It will be assumed that the reader has access to the %mathematical description of the model provided on-line in the %Supplementary Materials for the paper henceforth referred to here simply %as the "Supplement". The sections of the Supplement are numbered %for convenient reference, and these will be referred to here as necessary. % The Supplement contains a table relating the variable names used within the %program to those used in the mathematical discription. The latter were %selected to facilitate writing mathematical expressions, but since Greek %letters, subscripts, etc are not available within Matlab, %variable names differ somewhat between the program itself and the mathematical %description of it. A table of equivalents is given in the Manual accompanying this program. Note also %that in order to increase readability without %using extensive dashes, case of letters in variable and parameter names %was adjusted arbitrarily to help the eye parse long variable names. E.g. %the "CEM" and "cem" in "CEMs==1" and "Acem", respectively, both refer to central nucleus. % Another notational matter worth mention is that in the mathematical %description of the Supplement we generally specified the nucleus and cell %type of a variable as a subscript; thus "A subscript LAp" was the %activation of principal cells of LA. However, in the program, the %amygdala principal cells of LA were called "p" cells, the principal cells %of BL were called "q", the inhibitors of LA were referred to as "i" cells %and the inhibitors of BL were called "j" cells. Thus the activation of LA %princpal cells in the program is simply Ap. %Finally, note that this version of the program includes an animation utility carried %over from the teaching version of the program from which this research version was %derived (with considerable substantive changes, including a signifcantly %more complicated amygdala anatomy, and removal of many teaching-related features). %The animation utility requires several files loaded in the lines below. These files must be %included in the same folder as the .m file itself. If they are not wanted, %they and the parts of the program that use them can easily be removed. %They are of virtually no scientific value, but were retained in this %version simply because the author is fond of the animation. hmainTemp=gcf; figure(1) set(1,'Name','Animation') A=imread('Slide1.jpg'); imshow(A,'InitialMagnification',50) global positionFig1 positionFig1=get(1,'Position'); positionFig1 = positionFig1-[0 200 0 0]; hFig1Axes=gca; positionFig1Axes=get(hFig1Axes, 'Position'); positionFig1Axes(1)=0; positionFig1Axes(2)=0; set(hFig1Axes,'Position',positionFig1Axes) set(1,'Position',positionFig1) global hmain animateflag load fratframes1 %loads array fratnormframes used for animation. load fratshkd3frames %loads array of same name used for animation. hmain=hmainTemp; animateflag=0; %CODE FOR MODEL PROPER BEGINS HERE. %Declarations %Parameters global alphaLA betaLA etaLA zetaLA alphaBL betaBL etaBL zetaBL thrshElig global psec ArMultLA ArMultBL global thrshRp thrshRq global Gi Gj Gr Kp Ki Kq2 Kj Dp Dq global Np global VpMax VqMaxCa VqMax ViMax VjMax global Habitcx HabitBL HabitLA global ExtFactorSwitch LA_BLplastSwitch Gpq global Nrows global E Gus netMax global Gleak a b c d global bmode bbot btop bother global zmode zbot ztop zother global NTcntxt NTcntxt_cs NTcntxt_0 q %Note:NTcntxt_0 is the number of neurons representing the context alone in %the absence of any CS. It was set to zero in all simulations of Krasne et %al (2011). global Grp Grq Gp_cem Gp_cemON global ilTau ilExp ilCmpndTau ilCmpndExp global ilHxTau ilHxExp ilHxCmpndTau ilHxCmpndExp global NPcs NPcntxt NPcntxt_cs NPcntxt_0 global NHcs NHcntxt NHcntxt_cs NHcntxt_0 NIcs NIcntxt NIcntxt_cs NIcntxt_0 global NT NP NH NI %Working arrays of Ns that have been specified elsewhere global thrshRi thrshRj thrshXp endXp thrshXq endXq thrshXi gammaXi thrshXj gammaXj global Fsmrd0 mxHx mx global conrate ilIncr ilHxIncr ilIncrCmpnd ilHxIncrCmpnd global opThrsh pi maxsec maxhabit starthabit endhabit Habit %Control variables global hConsolButton hHxButton hHsButton global fig2on fig3on fig4on fig5on fig8on fig9on fig10on global Ishk naloxone global LAs Hs Hx BLs CEMs PFCs hilABCto1Button hilHxABCto1Button PAGptx PAGmuscimol global pcentHs global FamAllCntxts global hBLsButton global hLAsButton hCEMsButton hPFCsButton global KeepOldFraidy global SS SSdurations SSrests %Pameter values: alphaLA=.015; betaLA=.000003; etaLA=.01; zetaLA=0; alphaBL=.009; betaBL=7e-7; etaBL=.01; zetaBL=.0000; Gus=100000; Gi=8; Gj=8; Gr=1; psec=.2; ArMultLA=1; ArMultBL=1; Gpq=2; Gp_cemON=1; VpMax=80; VqMaxCa=80; VqMax=66.67; ViMax=30 ; VjMax=30; opThrsh=0.2; pi=1.25; BlkExp=2; NPcs=100; NPcntxt=1; NPcntxt_cs=0; NIcntxt=0; NHcntxt=200; NHcntxt_cs=250; NTcntxt=56; NTcntxt_cs=250; NPcntxt_0=0; NHcs=0; NIcs=0; NTcntxt_0=0; NIcntxt_cs=0; NHcntxt_0=0; NIcntxt_0=0; Np=1; %startLTPfactorLA=0.5; %startLTPfactorBL=0.5; %thrshRp=startLTPfactorLA*VpMax; %thrshRq=startLTPfactorBL*VqMax; %Equivalents in pre-public version: thrshRp=40; % =startLTPfactorLA*VpMax thrshRi=40; % =startLTPfactorLA*VpMax thrshRq=40; % =startLTPfactorBL*VqMaxCa thrshRj=40; % =startLTPfactorBL*VqMaxCa thrshXp=20; endXp=50; thrshXq=20; endXq=50; thrshXi=0; gammaXi=13; thrshXj=0; gammaXj=13; a=.3; b=.66; c=.9; %rise rate of freezing d=.3; %fall rate of freezing (0 min; 1 max) maxsec=0.4; conrate=.1; ilIncr=.003; ilIncrCmpnd=.03; ilHxIncr=.005; ilHxIncrCmpnd=.005; thrshElig=.05; Grp=20; Grq=20; ilTau=.6; ilExp=2.5; ilCmpndTau=.1; ilCmpndExp=1; ilHxTau=.2; ilHxExp=2.5; ilHxCmpndTau=.1; ilHxCmpndExp=1; mx=.9875; mxHx=.98; ExtFactorSwitch=0; LA_BLplastSwitch=0; E=100; Ishk=100; %Author self-note: The following N arrays are for convenience in later calculations and %were moved here from function initializefraidy where they were placed at %a time when N's were changed by the program. Things should be revised %so that NI and NH and replace NI as appropriate. NP=[NPcntxt NPcntxt NPcntxt NPcs NPcs NPcntxt_cs NPcntxt_cs NPcntxt_cs NPcntxt_cs NPcntxt_cs NPcntxt_cs NPcntxt_0 NPcntxt_0 NPcntxt_0]; NH=[NHcntxt NHcntxt NHcntxt NHcs NHcs NHcntxt_cs NHcntxt_cs NHcntxt_cs NHcntxt_cs NHcntxt_cs NHcntxt_cs NHcntxt_0 NHcntxt_0 NHcntxt_0]; NI=[NIcntxt NIcntxt NIcntxt NIcs NIcs NIcntxt_cs NIcntxt_cs NIcntxt_cs NIcntxt_cs NIcntxt_cs NIcntxt_cs NIcntxt_0 NIcntxt_0 NIcntxt_0]; NT=[NTcntxt NTcntxt NTcntxt 0 0 ... NTcntxt_cs NTcntxt_cs NTcntxt_cs NTcntxt_cs NTcntxt_cs NTcntxt_cs NTcntxt_0 NTcntxt_0 NTcntxt_0]; NI=NI; NH=NH; PFCs=0; LAs=0; BLs=0; CEMs=0;Hs=0;Hx=0; hConsolButton=0; hHxButton=0; hHsButton=0;hBLsButton=0; hLAsButton=0; hCEMsButton=0;hPFCsButton=0; hilABCto1Button=0;hilHxABCto1Button=0; Dp=1; Dq=1; Gp=0 ;Gq=0; Kp=1/VpMax; Kq1=1/VqMaxCa; Kq2=1/VqMax; Ki=1/ViMax; Kj=1/VjMax; Gleak=1; netMax=80; ch=.2; %context rep habituation factor bmode=2; bbot=0; btop=65; bother=50; zmode=3; zbot=20; ztop=50; zother=0; maxhabit=1; starthabit=20; endhabit=150; Habit=[ch ch ch 1 1 1 1 1 1 1 1 1 1 1]; %ch=contextual habit (<1). Habituation factors discount Habitcx=[Habit Habit Habit]; %the effectiveness of pure contextual inputs to amygdala HabitLA=Habitcx; HabitBL=[Habit 1]; Habit=[Habit Habit Habit Habit]; q=1; Gp_cem=0; naloxone=0; pcentHs=100; Nrows=10000; Fsmrd0=zeros(Nrows,1); SS=[1 0 0 0; 2 0 0 0; 3 0 0 0; 4 0 0 0; 5 0 0 0]; SSdurations=[0 0 0 0 0 0]; SSrests=[0 0 0 0]; FamAllCntxts=1; fig2on=0; fig3on=0; fig4on=0; fig5on=0; fig8on=0; fig9on=0; fig10on=0; PAGptx=0;PAGmuscimol=0; %H=zeros(1,14*4) ; %At least temporarily replaced by Habit array KeepOldFraidy=0; initializefraidy %End of parameter-setting and initialization %The function run_continue, which follows, is the basic work-horse of the model. It is %called by hitting the Go Run/Continue button of the Gui. After a few %preliminaries this sets in motion execution of the experiment scheduled in %the Exp array described below. It does this line by line via the loop, %for j=1:Nsched, where Nsched is the number of lines in the Exp array. A break in %execution of the schedule can be programmed into Exp so that various procedures %such as consolidation, production of certain lesions, etc can be called from %the GUI. When such breaks occur,the Exp row number at which execution should resume %is set equal to ContinueAt, and when the Run/Continue button is again hit the %run_continue function starts up again at this row of the Exp schedule. At %the end of running, the operator can either hit the "NewFraidy" button, %which essentially erases all memory of the experiment just done, or can %hit the "Reset Exp" button, which allows a new experiment to be done %without erasing FRAT's memory of the previous events. If the Reset Exp %option is used, the previous graphs and the information in them is erased, %but FRAT's "nervous system" maintains whatever state it was in. % --- Executes on button press in run_continue. function run_continue_Callback(hObject, eventdata, handles) %Declarations %Parameters global alphaLA betaLA etaLA zetaLA alphaBL betaBL etaBL zetaBL Gleak a b c d global psec ArMultLA ArMultBL E opThrsh pi global Gi Gj Dp Dq HabitBL HabitLA maxsec global Np Ncxi Ncxt Ncxp Nhc VpDist VqDist VpMax VqMax ViMax VjMax Gpq global thrshRp thrshRi thrshRq thrshRj thrshXp endXp thrshXq endXq thrshXi gammaXi thrshXj gammaXj global thrshElig global ilTau ilExp ilCmpndTau ilCmpndExp global ilHxTau ilHxExp ilHxCmpndTau ilHxCmpndExp mx mxHx Gp_cemON %Variables evaluated in W_INDEPENDENT EVALUATIONS routine global inptCS1 inptCS2 inptA inptB inptC global AcxpCS1 AcxpCS2 AcxpA AcxpB AcxpC AcxpA1 AcxpA2 AcxpB1 AcxpB2 AcxpC1 AcxpC2 global rNcxpCS1 rNcxpCS2 rNcxpA rNcxpB rNcxpC rNcxpA1 rNcxpA2 rNcxpB1 rNcxpB2 rNcxpC1 rNcxpC2 global AcxiA AcxiB AcxiC global rNcxiA rNcxiB rNcxiC global AcxtA AcxtB AcxtC AcxtA1 AcxtA2 AcxtB1 AcxtB2 AcxtC1 AcxtC2 global rNcxtA rNcxtB rNcxtC rNcxtA1 rNcxtA2 rNcxtB1 rNcxtB2 rNcxtC1 rNcxtC2 global AhcA AhcB AhcC AhcA1 AhcA2 AhcB1 AhcB2 AhcC1 AhcC2 global rNhcA rNhcB rNhcC rNhcA1 rNcxt rNhcA2 rNhcB1 rNhcB2 rNhcC1 rNhcC2 global Ap Ai Ar Af Afhist global rNcxp rNhc rNcxi global coefficientLA coefficientBL us Act global NT NP NH NI %Other variables of run_continue global Gpe Gie Gqe Gje Wp Ui Wq Uj Vq Vj Vp Bp Bq CaI Vi Exp global ContinueAt interrupt x Fsmrd Nsched nextstart Npoints interval global recalcActs global ilA ilB ilC ilA1 ilA2 ilB1 ilB2 ilC1 ilC2 il global ilHxA ilHxB ilHxC ilHxA1 ilHxA2 ilHxB1 ilHxB2 ilHxC1 ilHxC2 ilHx global conA conB conC conA1 conA2 conB1 conB2 conC1 conC2 con global Fsmrd0 Aop AopPrv Gp_cem global eligibleLA eligibleBL global oldAq oldAu oldAx Ax oldRinput newRinput Au AopPrv %Variables used for displays and graphing global Wdata Eventdata Net_Actdata netErecipI global fig2on fig3on fig4on fig5on fig8on fig9on %Variables associated with in special treatments or GUI input global Hx Hs BLs naloxone morphine Ishk FamAllCntxts global consolidate global CEMs LAs PFCs PAGptx PAGmuscimol pcentHs %Handles global hmain %Experiments are specified by an array called Exp that is constructed either %externally or by she "Short" scheduling utility callable from the FRAT GUI. % Each row of Exp has in order: % 1 2 3 4 5 6 7 % row number, cntxt, cs1, cs2, us, pause, dur (# of 1 sec comutation intervals) %Col 1: Exp array row # %Col 2: Context. 1~A, 2~B, 3~C. 0~no context; used optionally when a pause % in the expreriment is scheduled. %Col 3: 1~CS1 on; 0~CS1 off %Col 4: 1~CS2 on; 0~CS2 off %Col 5: 1~US on; 0~US off %Col 6: 0~no pause; 1~pause experiment until Run/Resume button on GUI hit. % When value is unity (pause called) other column 2,3,4,5, and 7 values are % ignored. %Col 7: Number of computation intervals during which to apply % specifications of this row. Not relevant for lines requesting a % pause. %Cortical and hippocampal inputs to the amygdala are represented, often in %parallel, by specific variables, such as AcxpA (i.e. the activation of the %cortical cxp cell type representing context A) and by arrays (or portion %of an array) that carry the same information for all inputs of some %category. This is done to simplify certain calculations. In such cases %the 14 types of stimulus that innervate amygdala are generally represented in the %following order: % 1 2 3 4 5 6 7 8 9 10 11 12 13 14 %cntxtA cntxtB cntxtC cs1 cs2 A*1 A*2 B*1 B*2 C*1 C*2 A*0 B*0 C*0 %Thus AcxpA might also be represented as Acxp(1). %Some arrays repeat this sequence for inputs from the separate cell populations %cxp, hc, cxi, and cxt, as required for the computation being done. hh=findobj('Tag','run_continue'); set(hh,'BackgroundColor','red'); if ContinueAt==1 %This is the first run of program or after a reset %Some required initializations. Nsched = size(Exp,1); Npoints=0; morphine=0; consolidate=0; for j=1:Nsched %Calculate Npoints for graphs. if Exp(j,6)==1 Npoints=Npoints+1 ; %Make room in graph to place line indicating pause. else Npoints=Npoints+Exp(j,7); %Regular line. end end oldAq=0; oldAu=0; oldAx=0; Ax=0; oldRinput=0; newRinput=0;Au=0; AopPrv=0; interval=0; nextstart=1; Act=zeros(1,14*4); %Act is the full set of activations from which Vp and Vi are calculated. if FamAllCntxts==1 if Hx==0 && Hs==0, ilA=1;il(1)=1;ilB=1;il(2)=1;ilC=1;il(3)=1;end end end %endof ifContinueAt==1 figure(7); openfigs(7)=1; set(7,'Name','Progress') set(7,'Units','normalized','Position',[.2 .2 .6 .1]) bars=[0 Npoints]; barh(bars) if ContinueAt >1, close(4);close(2);close(3);close(8);close(5);close(9);end %%%%%%%%%%%%%%%%%%%%%%Start implementing rows of Exp array%%%%%%%%%%%%%%% for j=ContinueAt :Nsched %Interprets lines of Experimental Schedule Array (Exp) %inpt CS1, CS2, A, B, C, US, and Pause Execution are read from lines of %Experimental Schedule Array (Exp)which is constructed from information entered %on GUI or written independently (see instructions for using program %for details or explanation above). cntxt=Exp(j,2); cs1=Exp(j,3); cs2=Exp(j,4); us=Exp(j,5); dur=Exp(j,7); interrupt=Exp(j,6); if interrupt==1 ContinueAt=j+1; interval=interval+1; Eventdata(interval,1:6)=[interval cntxt cs1 cs2 us interrupt]; Wdata(interval,1:6)=Wdata(interval-1,1:6); %So not zero. break %BREAK end %Calculate coefficient. See Supplement Section 2.4.1-.4 %Transform Exp info to inpt form for convenience in following calculations: if cs1==1, inptCS1=1; else inptCS1=0;end if cs2==1, inptCS2=1; else inptCS2=0;end if cntxt==1, inptA=1; else inptA=0;end if cntxt==2, inptB=1; else inptB=0;end if cntxt==3, inptC=1; else inptC=0;end %..........Steps 1-4 (2.4.1-.4)of Supplement follow........... %These calculate activations and rN values for cortical and hippocampal cells. %We call this set of steps W_INDEPENDENT EVALUATIONS. %It is used twice and repeated in full each time, because it runs faster %that way than if called as a subroutine. %W_INDEPENDENT EVALUATIONS (Annotated version; repetition used below is %identical but not annotated). This pass done at start of new line of Exp: %Obtain consolidation status (0 or 1)and extent of implicit learning mediated by hippocampus, %as well as implicit learning mediated by representation cortex (when hippocampus %has been ablated) from con, il, and ilHx arrays. Switches Hx, Hs, %PFCs, BLs, LAs, and CEMs (x for ablated, s for suppressed) are defined %on p 13 of SUPPLEMENTARY MATERIALS and obtained from the GUI and interpreted %in separate functions below. conA=con(1);conB=con(2);conC=con(3);conA1=con(6);conA2=con(7);conB1=con(8); conB2=con(9);conC1=con(10);conC2=con(11); ilA=il(1);ilB=il(2);ilC=il(3);ilA1=il(6);ilA2=il(7);ilB1=il(8);ilB2=il(9);ilC1=il(10);ilC2=il(11); ilHxA=ilHx(1);ilHxB=ilHx(2);ilHxC=ilHx(3);ilHxA1=ilHx(6);ilHxA2=ilHx(7);ilHxB1=ilHx(8);ilHxB2=ilHx(9);ilHxC1=ilHx(10);ilHxC2=ilHx(11); %Set cxp A and rN values (Supplement Step 1, Sect 2.4.1): if inptCS1==1, AcxpCS1=1; rNcxpCS1=1; else AcxpCS1=0;rNcxpCS1=0;end if inptCS2==1, AcxpCS2=1; rNcxpCS2=1; else AcxpCS2=0;rNcxpCS2=0;end if inptA==1, AcxpA=1; rNcxpA=1; else AcxpA=0;rNcxpA=0;end if inptB==1, AcxpB=1; rNcxpB=1; else AcxpB=0;rNcxpB=0;end if inptC==1, AcxpC=1; rNcxpC=1; else AcxpC=0;rNcxpC=0;end AcxpA1=AcxpA*AcxpCS1;rNcxpA1=AcxpA1; AcxpA2=AcxpA*AcxpCS2;rNcxpA2=AcxpA2; AcxpB1=AcxpB*AcxpCS1;rNcxpB1=AcxpB1; AcxpB2=AcxpB*AcxpCS2;rNcxpB2=AcxpB2; AcxpC1=AcxpC*AcxpCS1;rNcxpC1=AcxpC1; AcxpC2=AcxpC*AcxpCS2;rNcxpC2=AcxpC2; %Get hc A and rN values as a function of cxp values (Supplement Step 2, Sect 2.4.2): %con specifies the consolidation state for each configural stimulus. %0=unconsolidated; 1= consolidated. Once the representation of a %stimulus as moved to cortex or if hc is absent or suppressede Ahc for %that stimulus is zero. AhcA=ilA*(1-conA)*(1-Hx)*(1-Hs*(pcentHs/100))*AcxpA*rNcxpA; rNhcA=AhcA; AhcB=ilB*(1-conB)*(1-Hx)*(1-Hs*(pcentHs/100))*AcxpB*rNcxpB; rNhcB=AhcB; AhcC=ilC*(1-conC)*(1-Hx)*(1-Hs*(pcentHs/100))*AcxpC*rNcxpC; rNhcC=AhcC; %Note: Ahc values for context/CS compounds are geometric means of %activations for the context and the CS so that if either is zero, Ahc %for the compound will be zero. AhcA1=ilA1*(1-conA1)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpA*AcxpCS1)*sqrt(rNcxpA*rNcxpCS1); rNhcA1=AhcA1; AhcA2=ilA2*(1-conA2)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpA*AcxpCS2)*sqrt(rNcxpA*rNcxpCS2); rNhcA2=AhcA2; AhcB1=ilB1*(1-conB1)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpB*AcxpCS1)*sqrt(rNcxpB*rNcxpCS1); rNhcB1=AhcB1; AhcB2=ilB2*(1-conB2)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpB*AcxpCS2)*sqrt(rNcxpB*rNcxpCS2); rNhcB2=AhcB2; AhcC1=ilC1*(1-conC1)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpC*AcxpCS1)*sqrt(rNcxpC*rNcxpCS1); rNhcC1=AhcC1; AhcC2=ilC2*(1-conC2)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpC*AcxpCS2)*sqrt(rNcxpC*rNcxpCS2); rNhcC2=AhcC2; %Get cxi values as a function of hc values, or if consolidation of a %stimulus has occurred or if hc is ablated and coritically compensated %incidental learning is occurring, then in terms of cxp values (Supplement Step 3, Sect 2.4.3): %Note that input to cxi cells comes from hc initially in normal FRAT but %comes from cxp cells after consolidation or if hc is ablated. The linsig function %is used as a simple way to keep A and rN between zero and unity as required by %their definitions. Also note that in the simulations of Krasne et al (2011)the number of cxi neurons %is set to zero for reasons given in the paper. AcxiA=ilA*((1-conA)*AhcA + linsig(conA+ilHxA ,0,1)*AcxpA)*((1-conA)*rNhcA + conA*rNcxpA); rNcxiA=AcxiA; AcxiB=ilB*((1-conB)*AhcB + linsig(conB+ilHxB ,0,1)*AcxpB)*((1-conB)*rNhcB + conB*rNcxpB); rNcxiB=AcxiB; AcxiC=ilC*((1-conC)*AhcC + linsig(conC+ilHxC ,0,1)*AcxpC)*((1-conC)*rNhcC + conC*rNcxpC); rNcxiC=AcxiC; %Get cxt values as a function of cxp values (Supplement Step 4, Sect 2.4.4): %Note that cxt cells get input from cxp cells only if consolidation has %occurred and/or if cortically compensated incidental learning has %occurred. AcxtA=linsig(conA+ilHxA,0,1)*AcxpA*rNcxpA; rNcxtA=AcxtA; AcxtB=linsig(conB+ilHxB,0,1)*AcxpB*rNcxpB; rNcxtB=AcxtB; AcxtC=linsig(conC+ilHxC,0,1)*AcxpC*rNcxpC; rNcxtC=AcxtC; AcxtA1=linsig(conA1+ilHxA1,0,1)*sqrt(AcxpA*AcxpCS1)*sqrt(rNcxpA*rNcxpCS1);rNcxtA1=AcxtA1; AcxtA2=linsig(conA2+ilHxA2,0,1)*sqrt(AcxpA*AcxpCS2)*sqrt(rNcxpA*rNcxpCS2);rNcxtA2=AcxtA2; AcxtB1=linsig(conB1+ilHxB1,0,1)*sqrt(AcxpB*AcxpCS1)*sqrt(rNcxpB*rNcxpCS1);rNcxtB1=AcxtB1; AcxtB2=linsig(conB2+ilHxB2,0,1)*sqrt(AcxpB*AcxpCS2)*sqrt(rNcxpB*rNcxpCS2);rNcxtB2=AcxtB2; AcxtC1=linsig(conC1+ilHxC1,0,1)*sqrt(AcxpC*AcxpCS1)*sqrt(rNcxpC*rNcxpCS1);rNcxtC1=AcxtC1; AcxtC2=linsig(conC2+ilHxC2,0,1)*sqrt(AcxpC*AcxpCS2)*sqrt(rNcxpC*rNcxpCS2);rNcxtC2=AcxtC2; if PFCs==1 %This obliterates cxt cell values to conform to experimental %obervations that consolidated context fear is not expressed %if PFC is ablated (Supplement Sect 2.5.2): AcxtA=0;rNcxtA=0; AcxtB=0;rNcxtB=0; AcxtC=0;rNcxtC=0; AcxtA1=0;rNcxtA1=0; AcxtA2=0;rNcxtA2=0; AcxtB1=0;rNcxtB1=0; AcxtB2=0;rNcxtB2=0; AcxtC1=0;rNcxtC1=0; AcxtC2=0;rNcxtC2=0; end %Reminder: Entries within arrays are in order % 1 2 3 4 5 6 7 8 9 10 11 12 13 14 %cntxtA cntxtB cntxtC cs1 cs2 A*1 A*2 B*1 B*2 C*1 C*2 A*0 B*0 C*0 %The lines from here to the end of this routine place the results of the %above evaluations into arrays that allow later calculations to be %specified more compactly. Note that these arrays were constructed to have %entries for A*0, B*0, and C*0,which correspond to conjunctions of the %form context A but CS absence,etc., but these were assumed to be null for %the purposes of the simulations done in Krasne et al (2011). rNcxp=[rNcxpA rNcxpB rNcxpC rNcxpCS1 rNcxpCS2 rNcxpA1 rNcxpA2 rNcxpB1 rNcxpB2 rNcxpC1 rNcxpC2 0 0 0]; Ncxp=rNcxp.*NP; rNhc=[rNhcA rNhcB rNhcC 0 0 rNhcA1 rNhcA2 rNhcB1 rNhcB2 rNhcC1 rNhcC2 0 0 0]; Nhc=rNhc.*NH; rNcxi=[rNcxiA rNcxiB rNcxiC 0 0 0 0 0 0 0 0 0 0 0]; Ncxi=rNcxi.*NI; rNcxt=[rNcxtA rNcxtB rNcxtC 0 0 rNcxtA1 rNcxtA2 rNcxtB1 rNcxtB2 rNcxtC1 rNcxtC2 0 0 0]; Ncxt=rNcxt.*NT; NLAactive=[Ncxp Ncxi Ncxt]; NBLactive=[Nhc Np]; %For use later ActLA=(1-LAs)*[AcxpA AcxpB AcxpC AcxpCS1 AcxpCS2 AcxpA1 AcxpA2 AcxpB1 AcxpB2 AcxpC1 AcxpC2 0 0 0 ... AcxiA AcxiB AcxiC 0 0 0 0 0 0 0 0 0 0 0 ... AcxtA AcxtB AcxtC 0 0 AcxtA1 AcxtA2 AcxtB1 AcxtB2 AcxtC1 AcxtC2 0 0 0]; for k=1:3*14 %Set activation to zero if N=0; needed so eligibility calculations work right if NLAactive(k)==0,ActLA(k)=0;end end %The following coefficient array is used to simplify calculation of %activations at later steps. coefficientLA=ActLA.*NLAactive.*HabitLA; %END OF W_INDEPENDENT EVALUATIONS (end annotated version). This pass done @ start new line of Exp %%%%Calculations done for every computation interval (once per nominal second)%%%% for i= 1 : dur %This repeats the current line of Exp dur times. interval=interval+1; %update calculation interval ("one-sec" time-step) %Write event data to data array: Eventdata(interval,1:6)=[interval cntxt cs1 cs2 us interrupt]; %Enter info into arrays for making graphs if recalcActs==1 %If implicit learning has occurred during the previous interval, %we need to do W_INDEPENDENT EVALUATIONS again before evaluating amygdala. %W_INDEPENDENT EVALUATIONS: (Calculations identical to annotated version above) conA=con(1);conB=con(2);conC=con(3);conA1=con(6);conA2=con(7);conB1=con(8); conB2=con(9);conC1=con(10);conC2=con(11); ilA=il(1);ilB=il(2);ilC=il(3);ilA1=il(6);ilA2=il(7);ilB1=il(8);ilB2=il(9);ilC1=il(10);ilC2=il(11); ilHxA=ilHx(1);ilHxB=ilHx(2);ilHxC=ilHx(3);ilHxA1=ilHx(6);ilHxA2=ilHx(7);ilHxB1=ilHx(8);ilHxB2=ilHx(9);ilHxC1=ilHx(10);ilHxC2=ilHx(11); if inptCS1==1, AcxpCS1=1; rNcxpCS1=1; else AcxpCS1=0;rNcxpCS1=0;end if inptCS2==1, AcxpCS2=1; rNcxpCS2=1; else AcxpCS2=0;rNcxpCS2=0;end if inptA==1, AcxpA=1; rNcxpA=1; else AcxpA=0;rNcxpA=0;end if inptB==1, AcxpB=1; rNcxpB=1; else AcxpB=0;rNcxpB=0;end if inptC==1, AcxpC=1; rNcxpC=1; else AcxpC=0;rNcxpC=0;end AcxpA1=AcxpA*AcxpCS1;rNcxpA1=AcxpA1; AcxpA2=AcxpA*AcxpCS2;rNcxpA2=AcxpA2; AcxpB1=AcxpB*AcxpCS1;rNcxpB1=AcxpB1; AcxpB2=AcxpB*AcxpCS2;rNcxpB2=AcxpB2; AcxpC1=AcxpC*AcxpCS1;rNcxpC1=AcxpC1; AcxpC2=AcxpC*AcxpCS2;rNcxpC2=AcxpC2; AhcA=ilA*(1-conA)*(1-Hx)*(1-Hs*(pcentHs/100))*AcxpA*rNcxpA; rNhcA=AhcA; AhcB=ilB*(1-conB)*(1-Hx)*(1-Hs*(pcentHs/100))*AcxpB*rNcxpB; rNhcB=AhcB; AhcC=ilC*(1-conC)*(1-Hx)*(1-Hs*(pcentHs/100))*AcxpC*rNcxpC; rNhcC=AhcC; AhcA1=ilA1*(1-conA1)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpA*AcxpCS1)*sqrt(rNcxpA*rNcxpCS1); rNhcA1=AhcA1; AhcA2=ilA2*(1-conA2)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpA*AcxpCS2)*sqrt(rNcxpA*rNcxpCS2); rNhcA2=AhcA2; AhcB1=ilB1*(1-conB1)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpB*AcxpCS1)*sqrt(rNcxpB*rNcxpCS1); rNhcB1=AhcB1; AhcB2=ilB2*(1-conB2)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpB*AcxpCS2)*sqrt(rNcxpB*rNcxpCS2); rNhcB2=AhcB2; AhcC1=ilC1*(1-conC1)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpC*AcxpCS1)*sqrt(rNcxpC*rNcxpCS1); rNhcC1=AhcC1; AhcC2=ilC2*(1-conC2)*(1-Hx)*(1-Hs*(pcentHs/100))*sqrt(AcxpC*AcxpCS2)*sqrt(rNcxpC*rNcxpCS2); rNhcC2=AhcC2; AcxiA=ilA*((1-conA)*AhcA + linsig(conA+ilHxA,0,1)*AcxpA)*((1-conA)*rNhcA+conA*rNcxpA); rNcxiA=AcxiA; AcxiB=ilB*((1-conB)*AhcB + linsig(conB+ilHxB,0,1)*AcxpB)*((1-conB)*rNhcB+conB*rNcxpB); rNcxiB=AcxiB; AcxiC=ilC*((1-conC)*AhcC + linsig(conC+ilHxC,0,1)*AcxpC)*((1-conC)*rNhcC+conC*rNcxpC); rNcxiC=AcxiC; AcxtA=linsig(conA+ilHxA,0,1)*AcxpA*rNcxpA; rNcxtA=AcxtA; AcxtB=linsig(conB+ilHxB,0,1)*AcxpB*rNcxpB; rNcxtB=AcxtB; AcxtC=linsig(conC+ilHxC,0,1)*AcxpC*rNcxpC; rNcxtC=AcxtC; AcxtA1=linsig(conA1+ilHxA1,0,1)*sqrt(AcxpA*AcxpCS1)*sqrt(rNcxpA*rNcxpCS1);rNcxtA1=AcxtA1; AcxtA2=linsig(conA2+ilHxA2,0,1)*sqrt(AcxpA*AcxpCS2)*sqrt(rNcxpA*rNcxpCS2);rNcxtA2=AcxtA2; AcxtB1=linsig(conB1+ilHxB1,0,1)*sqrt(AcxpB*AcxpCS1)*sqrt(rNcxpB*rNcxpCS1);rNcxtB1=AcxtB1; AcxtB2=linsig(conB2+ilHxB2,0,1)*sqrt(AcxpB*AcxpCS2)*sqrt(rNcxpB*rNcxpCS2);rNcxtB2=AcxtB2; AcxtC1=linsig(conC1+ilHxC1,0,1)*sqrt(AcxpC*AcxpCS1)*sqrt(rNcxpC*rNcxpCS1);rNcxtC1=AcxtC1; AcxtC2=linsig(conC2+ilHxC2,0,1)*sqrt(AcxpC*AcxpCS2)*sqrt(rNcxpC*rNcxpCS2);rNcxtC2=AcxtC2; if PFCs==1 AcxtA=0;rNcxtA=0; AcxtB=0;rNcxtB=0; AcxtC=0;rNcxtC=0; AcxtA1=0;rNcxtA1=0; AcxtA2=0;rNcxtA2=0; AcxtB1=0;rNcxtB1=0; AcxtB2=0;rNcxtB2=0; AcxtC1=0;rNcxtC1=0; AcxtC2=0;rNcxtC2=0; end %Reminder: Entries within arrays are in order % 1 2 3 4 5 6 7 8 9 10 11 12 13 14 %cntxtA cntxtB cntxtC cs1 cs2 A*1 A*2 B*1 B*2 C*1 C*2 A*0 B*0 C*0 rNcxp=[rNcxpA rNcxpB rNcxpC rNcxpCS1 rNcxpCS2 rNcxpA1 rNcxpA2 rNcxpB1 rNcxpB2 rNcxpC1 rNcxpC2 0 0 0]; Ncxp=rNcxp.*NP; rNhc=[rNhcA rNhcB rNhcC 0 0 rNhcA1 rNhcA2 rNhcB1 rNhcB2 rNhcC1 rNhcC2 0 0 0]; Nhc=rNhc.*NH; rNcxi=[rNcxiA rNcxiB rNcxiC 0 0 0 0 0 0 0 0 0 0 0]; Ncxi=rNcxi.*NI; rNcxt=[rNcxtA rNcxtB rNcxtC 0 0 rNcxtA1 rNcxtA2 rNcxtB1 rNcxtB2 rNcxtC1 rNcxtC2 0 0 0]; Ncxt=rNcxt.*NT; NLAactive=[Ncxp Ncxi Ncxt]; NBLactive=[Nhc Np]; ActLA=(1-LAs)*[AcxpA AcxpB AcxpC AcxpCS1 AcxpCS2 AcxpA1 AcxpA2 AcxpB1 AcxpB2 AcxpC1 AcxpC2 0 0 0 ... AcxiA AcxiB AcxiC 0 0 0 0 0 0 0 0 0 0 0 ... AcxtA AcxtB AcxtC 0 0 AcxtA1 AcxtA2 AcxtB1 AcxtB2 AcxtC1 AcxtC2 0 0 0]; for k=1:3*14 if NLAactive(k)==0,ActLA(k)=0;end end coefficientLA=ActLA.*NLAactive.*HabitLA; %END OF W_INDEPENDENT EVALUATIONS (un-annotated version) end %End of "if recalcActs==1" %Evaluations of amygdala activation levels and other %evaluations that are affected by amygdala synaptic weights are done %now. (Supplement Step 5, Sect 2.4.5). Some of these evaluations are done %again after weights are changed. %Supplement Step 5A, Sect 2.4.5.1 %AMYG EVALS: %LA evaluations: Wp=dot(coefficientLA,Gpe); Ui=dot(coefficientLA,Gie); %These dot products make subsequenct %calculations more convenient. Vi=Ui*E/(1+Ui); Ai=linsig(Vi,0,ViMax); %Calculate depolarzation (V) and activity (A)for inhbitory %interneurons. VpDist=Wp*E/(1+Wp); %Calculate V for distal compartment of p cell. Vp = Dp*VpDist/(1+Ai*Gi); Ap=linsig(Vp,0,VpMax); %Get V for prox compartent and activation. if LAs==1, Vp=0; Vi=0;Ai=0;Ap=0; end %Effect LA suppression if called for by GUI. %BL evaluations: ActBL=[AhcA AhcB AhcC 0 0 AhcA1 AhcA2 AhcB1 AhcB2 AhcC1 AhcC2 0 0 0 Ap]; %Note that Ap has been tacked on to the end of the above array and to BL cell %synaptic weight arrays because the LA principal cells provide one of the inputs to BL cells. %However, in this version of the program the LA-to-BL synapses are not plastic. %Set activation to zero if N=0; needed so eligibility works right. %This is just a precaution. (Eligibility of an afferet synapse on an %amygdala neuron for change on interval n+1 is a function of its activation level %on interval n; however, we were concerned that in some cases the program might, due to a %programming oversight, calculate an activation for an afferent for %which rN or N are zero. This would have no impact in most cases, since %if N=0, the product of A*N*rN will be zero. However, an elevated activation %could lead to an unwanted elgibility for change being created): for k=1:14 if NBLactive(k)==0,ActBL(k)=0;end end coefficientBL=ActBL.*NBLactive.*HabitBL; Wq=dot(coefficientBL,Gqe); Uj=dot(coefficientBL,Gje); Vj=Uj*E/(1+Uj); Aj=linsig(Vj,0,VjMax); VqDist=Wq*E/(1+Wq); Vq=Dq*VqDist/(1+Aj*Gj); Aq=linsig(Vq,0,VqMax); if BLs==1, Vq=0;Vj=0;Aj=0;Aq=0; end %Effect BL suppression if requested by GUI %END AMYG EVALS %.....Supplement Step 5B (Sect 2.4.5.2). Evaluate CEm.......... if BLs==0 Acem=Aq; else Acem=linsig(Ap*Gp_cem,0,1); end if CEMs==1, Acem=0; end %.............Supplement Step 6 (Sect 2.4.6)................. %Calcuclate Af and Freezing scores and save latter in array for later %plotting: if us==0, Af=linsig(Acem,a,b);else Af=0; end Afhist(interval)=Af; %Write Af to array for later plotting if interval==1 Fsmrd0(interval)=0; %Fsmrd is a temporally smeared version of Af else if Afhist(interval)> Fsmrd0(interval-1) Fsmrd0(interval)=Fsmrd0(interval-1)+c*(Afhist(interval)-Fsmrd0(interval-1)); else Fsmrd0(interval)=Fsmrd0(interval-1) - d*(Fsmrd0(interval-1) - Afhist(interval)); end end %Fsmrd is the freezing score that gets plotted. if us==0, Fsmrd(interval)=Fsmrd0(interval); else Fsmrd(interval)=0;end %...........Not in Supplement........... %These values that give something of a picture of what is going on in %LA and BL are calculated and saved in an array for later plotting: netErecipI(interval,1)=VpDist/E; netErecipI(interval,2)= 1+Ai*Gi; netErecipI(interval,3)=VqDist/E; netErecipI(interval,4)=1+Aj*Gj; Net_Actdata(interval,1:4)=[Vp Ap Vq Aq]; %......Supplement Step 7 (Sect 2.4.7). Calculate Ar and Ax....... %Calculate Ar and Ax first time %Used from previous computation interval: %oldRinput used to compute change (uses previous naloxone value) %AopPrv used to discount Au for prior CR Aop=linsig(Acem,opThrsh,1); As=linsig(Acem,0,maxsec); Au=us*(Ishk/100)*(1-((1-naloxone)*AopPrv)^pi); newRinput=Au+psec*As; Ar=linsig(newRinput-oldRinput,0,1); if (Ar>0)||(us==1),Ax=0;else Ax=(1-naloxone)*Aop;end if PAGptx==1, Ax=1;end %A few experiments for Supplement were done under this condition if PAGmuscimol==1, Ax=0;end % " %...Supplement Step 8 (Sect 2.4.8). Calculate p cell backprop activity.... %and inhib interneuron Ca levels. Bp=100*linsig(Vp+100*Ar*ArMultLA,0,100); Bq=100*linsig(Vq+100*Ar*ArMultBL,0,100); kappaLA=100;kappaBL=100; CaI=100*linsig(Ap*VpMax+ kappaLA*Ar, 0, 100); %the multiplier of Ar here was CaJ=100*linsig(Aq*VqMax+ kappaBL*Ar, 0, 100); if LAs==1, Bp=0; CaI=0; end if BLs==1, Bq=0; CaJ=0; end %......Supplement Step 9 (Sect 2.4.9) Update amygdala synaptic weights... for k=1:14*3 if Ar>0 deltaGpe= eligibleLA(k)*Ar*alphaLA*linsig(Bp,thrshRp,E); deltaGie=-eligibleLA(k)*Ar*etaLA*linsig(CaI,thrshRi,E); %note: thrshRi=thrshRp else deltaGie= eligibleLA(k)*Ax*betaLA*BumpCa(CaI,thrshXi,E,gammaXi); deltaGpe=-eligibleLA(k)*Ax*zetaLA*BumpB(Bp,thrshXp,endXp); end Gpe(k)=Gpe(k)+deltaGpe; Gie(k)=Gie(k)+deltaGie; if Gpe(k)<0, Gpe(k)=0;end if Gie(k)<0, Gie(k)=0;end end for k=1:14 if Ar>0 deltaGqe=eligibleBL(k)*Ar*alphaBL*linsig(Bq,thrshRq,E); deltaGje=-eligibleBL(k)*Ar*etaBL*linsig(CaJ,thrshRj,E); else deltaGje= eligibleBL(k)*Ax*betaBL*BumpCa(CaJ,thrshXj,E,gammaXj); deltaGqe=-eligibleBL(k)*Ax*zetaBL*BumpB(Bq,thrshXq,endXq); end Gqe(k)=Gqe(k)+deltaGqe; Gje(k)=Gje(k)+deltaGje; if Gqe(k)<0, Gqe(k)=0;end if Gje(k)<0, Gje(k)=0;end end Gqe(15)=Gpq; Gje(15)=0; %Perhaps these should be made plastic. %.......Place current values into array for later graphing.................. netErecipI(interval,1)=VpDist/E; netErecipI(interval,2)= 1+Ai*Gi; netErecipI(interval,3)=VqDist/E; netErecipI(interval,4)=1+Aj*Gj; Net_Actdata(interval,1:4)=[Vp Ap Vq Aq]; %Color Order: red grn blk purple cyan %Variables to be graphed later assigned as convenient: Wdata(interval,1)=0; %plotted red Wdata(interval,2)=0; %plotted green Wdata(interval,3)=0; %plotted black Wdata(interval,4)=0; %plotted purple Wdata(interval,5)=0; %plotted cyan Wdata(interval,6)=0; %plotted gray %..............Step 10: Re-evaluate Amyg ...................... %AMYG EVALS Wp=dot(coefficientLA,Gpe); Ui=dot(coefficientLA,Gie); Vi=Ui*E/(1+Ui); Ai=linsig(Vi,0,ViMax); %Ai=Ki*Vi; VpDist=Wp*E/(1+Wp); Vp = Dp*VpDist/(1+Ai*Gi); Ap=linsig(Vp,0,VpMax); if LAs==1, Vp=0; Vi=0;Ai=0;Ap=0; end ActBL=(1-BLs)*[AhcA AhcB AhcC 0 0 AhcA1 AhcA2 AhcB1 AhcB2 AhcC1 AhcC2 0 0 0 Ap]; for k=1:14 %Set activation to zero if N=0; needed so eligibility works right if NBLactive(k)==0,ActBL(k)=0;end end coefficientBL=ActBL.*NBLactive.*HabitBL; Wq=dot(coefficientBL,Gqe); Uj=dot(coefficientBL,Gje); Vj=Uj*E/(1+Uj); Aj=linsig(Vj,0,VjMax); VqDist=Wq*E/(1+Wq); Vq=Dq*VqDist/(1+Aj*Gj); Aq=linsig(Vq,0,VqMax); if BLs==1, Vq=0;Vj=0;Aj=0;Aq=0; end %END AMYG EVALS %...........Step 11: Update LA-CE connectivity.................... if BLs==1 && Ap>0 && us==1 && CEMs==0, Gp_cem=Gp_cemON; end %.....Step 12: Calculate A'cem, R'inpt, and various "old" values under new synaptic weights..... Ar=0; if BLs==0 Acem=Aq; else Acem=linsig(Ap*Gp_cem,0,1); end if CEMs==1, Acem=0; end Aop=linsig(Acem,opThrsh,1); As=linsig(Acem,0,maxsec); Au=us*(Ishk/100)*(1-((1-naloxone)*AopPrv)^pi); oldRinput=Au+psec*As; AopPrv=Aop; %............Step 13: Update incidental learning.................. %Whenever incidental learning occurs the flag, recalcActs is set so %that W_INDEPENDENT EVALUATIONS, which are ordinarily done only at the %start of each line of the Exp schedule but which are affected by incidental learning, %will be re-run. if Hx==0 && Hs==0 if AcxpA>.01 recalcActs=1; ilo=ilA;if ilA<mx, ilA=ilA+ ilTau*(1-ilA)^ilExp; else ilA=1;end Gqe(1)=Gqe(1)*(ilo/ilA) ; Gje(1)=Gje(1)*(ilo/ilA) ; end if AcxpB>.01 recalcActs=1; ilo=ilB;if ilB<mx, ilB=ilB+ ilTau*(1-ilB)^ilExp; else ilB=1;end Gqe(2)=Gqe(2)*(ilo/ilB) ; Gje(2)=Gje(2)*(ilo/ilB) ; end if AcxpC>.01 recalcActs=1; ilo=ilC;if ilC<mx, ilC=ilC+ ilTau*(1-ilC)^ilExp; else ilC=1;end Gqe(3)=Gqe(3)*(ilo/ilC) ; Gje(3)=Gje(3)*(ilo/ilC) ; end if AcxpA>.01 && AcxpCS1>.01 recalcActs=1; ilo=ilA1;if ilA1<mx,ilA1=ilA*linsig(ilA1+ilCmpndTau*(1-ilA1)^ilCmpndExp,0,ilA);else ilA1=1;end Gqe(6)=Gqe(6)*(ilo/ilA1) ; Gje(6)=Gje(6)*(ilo/ilA1) ; end if AcxpA>.01 && AcxpCS2>.01 recalcActs=1; ilo=ilA2;if ilA2<mx, ilA2=ilA*linsig(ilA2+ilCmpndTau*(1-ilA2)^ilCmpndExp,0,ilA);else ilA2=1;end Gqe(7)=Gqe(7)*(ilo/ilA2) ; Gje(7)=Gje(7)*(ilo/ilA2) ; end if AcxpB>.01 && AcxpCS1>.01 recalcActs=1; ilo=ilB1;if ilB1<mx, ilB1=ilB*linsig(ilB1+ilCmpndTau*(1-ilB1)^ilCmpndExp,0,ilB);else ilB1=1;end %Try this Gqe(8)=Gqe(8)*(ilo/ilB1) ; Gje(8)=Gje(8)*(ilo/ilB1) ; end if AcxpB>.01 && AcxpCS2>.01 recalcActs=1; ilo=ilB2;if ilB2<mx, ilB2=ilB*linsig(ilB2+ilCmpndTau*(1-ilB2)^ilCmpndExp,0,ilB);else ilB2=1;end Gqe(9)=Gqe(9)*(ilo/ilB2) ; Gje(9)=Gje(9)*(ilo/ilB2) ; end if AcxpC>.01 && AcxpCS1>.01 recalcActs=1; ilo=ilC1;if ilC1<mx, ilC1=ilC*linsig(ilC1+ilCmpndTau*(1-ilC1)^ilCmpndExp,0,ilC);else ilC1=1;end Gqe(10)=Gqe(10)*(ilo/ilC1) ; Gje(10)=Gje(10)*(ilo/ilC1) ; end if AcxpC>.01 && AcxpCS2>.01 recalcActs=1; ilo=ilC2;if ilC2<mx, ilC2=ilC*linsig(ilC2+ilCmpndTau*(1-ilC2)^ilCmpndExp,0,ilC);else ilC2=1;end Gqe(11)=Gqe(11)*(ilo/ilC2) ; Gje(11)=Gje(11)*(ilo/ilC2) ; end il=[ilA ilB ilC 0 0 ilA1 ilA2 ilB1 ilB2 ilC1 ilC2 0 0 0]; elseif Hx==1 && PFCs<1 if AcxpA>.01 recalcActs=1; ilHxo=ilHxA;if ilHxA<mxHx,ilHxA=ilHxA+ilHxTau*(1-ilHxA)^ilHxExp;else ilHxA=1;end Gpe(29)=Gpe(29)*(ilHxo/ilHxA) ; Gie(29)=Gie(29)*(ilHxo/ilHxA) ; end if AcxpB>.01 recalcActs=1; ilHxo=ilHxB;if ilHxB<mxHx,ilHxB=ilHxB+ilHxTau*(1-ilHxB)^ilHxExp;else ilHxB=1;end Gpe(30)=Gpe(30)*(ilHxo/ilHxB) ; Gie(30)=Gie(30)*(ilHxo/ilHxB) ; end if AcxpC>.01 recalcActs=1; ilHxo=ilHxC;if ilHxC<mxHx,ilHxC=ilHxC+ilHxTau*(1-ilHxC)^ilHxExp;else ilHxC=1;end Gpe(31)=Gpe(31)*(ilHxo/ilHxC) ; Gie(31)=Gie(31)*(ilHxo/ilHxC) ; end if AcxpA>.01 && AcxpCS1>.01 recalcActs=1; ilHxo=ilHxA1;if ilHxA1<mxHx, ilHxA1=ilHxA*linsig(ilHxA1+ ilHxCmpndTau*(1-ilHxA1)^ilHxCmpndExp,0,ilHxA);else ilHxA1=1;end %Try this Gpe(34)=Gpe(34)*(ilHxo/ilHxA1) ; Gie(34)=Gie(34)*(ilHxo/ilHxA1) ; end if AcxpA>.01 && AcxpCS2>.01 recalcActs=1; ilHxo=ilHxA2;if ilHxA2<mxHx, ilHxA2=ilHxA*linsig(ilHxA2+ilHxCmpndTau*(1-ilHxA2)^ilHxCmpndExp,0,ilHxA);else ilHxA2=1;end %Try this Gpe(35)=Gpe(35)*(ilHxo/ilHxA2) ; Gie(35)=Gie(35)*(ilHxo/ilHxA2) ; end if AcxpB>.01 && AcxpCS1>.01 recalcActs=1; ilHxo=ilHxB1;if ilHxB1<mxHx, ilHxB1=ilHxB*linsig(ilHxB1+ilHxCmpndTau*(1-ilHxB1)^ilHxCmpndExp,0,ilHxB);else ilHxB1=1;end %Try this Gpe(36)=Gpe(36)*(ilHxo/ilHxB1) ; Gie(36)=Gie(36)*(ilHxo/ilHxB1) ; end if AcxpB>.01 && AcxpCS2>.01 recalcActs=1; ilHxo=ilHxB2;if ilHxB2<mxHx, ilHxB2=ilHxB*linsig(ilHxB2+ilHxCmpndTau*(1-ilHxB2)^ilHxCmpndExp,0,ilHxB);else ilHxB2=1;end %Try this Gpe(37)=Gpe(37)*(ilHxo/ilHxB2) ; Gie(37)=Gie(37)*(ilHxo/ilHxB2) ; end if AcxpC>.01 && AcxpCS1>.01 recalcActs=1; ilHxo=ilHxC1;if ilHxC1<mxHx, ilHxC1=ilHxC*linsig(ilHxC1+ilHxCmpndTau*(1-ilHxC1)^ilHxCmpndExp,0,ilHxC);else ilHxC1=1;end %Try this Gpe(38)=Gpe(38)*(ilHxo/ilHxC1) ; Gie(38)=Gie(38)*(ilHxo/ilHxC1) ; end if AcxpC>.01 && AcxpCS2>.01 recalcActs=1; ilHxo=ilHxC2;if ilHxC2<mxHx, ilHxC2=ilHxC*linsig(ilHxC2+ilHxCmpndTau*(1-ilHxC2)^ilHxCmpndExp,0,ilHxC);else ilHxC2=1;end %Try this Gpse(39)=Gpe(39)*(ilHxo/ilHxC2) ; Gie(39)=Gie(39)*(ilHxo/ilHxC2) ; end ilHx=[ilHxA ilHxB ilHxC 0 0 ilHxA1 ilHxA2 ilHxB1 ilHxB2 ilHxC1 ilHxC2 0 0 0]; end % End of "if Hx==0 && Hs==0". %...............................end update of implicit learning %....................Step 14: UPDATE ELEGIBILITY....................... for k=1:14*3 eligibleLA(k)=linsig(ActLA(k),thrshElig,1); end for k=1:14; eligibleBL(k)=linsig(ActBL(k),thrshElig,1); end if coefficientBL(15)>0, eligibleBL(15)=1;else eligibleBL(15)=0;end; %Prob never used. %...........................end update eligibility............ if mod(interval,50)==0 %For Progress graph during computations pause(.1) %If don't put a pause in here, graph doesn't get made until end. bars=[interval Npoints]; barh(bars); end end %End of "for i= 1 : dur" (within-line for loop) end %End of "for j=ContinueAt :Nsched" (lines of Exp table) %.............Code for graphs made by function run_continue................ %This code does not affect simulations. if interval>=Npoints hh=findobj('Tag','run_continue'); set(hh,'BackgroundColor','white'); end BW=1; %~Black and White. Makes non-color graphs for publication. clear x x=(1:interval); close(7) MyColorOrder=... [1 0 0;... %red 0 1 0;... %green 0 0 1;... %blue 0 0 0;... %black 0.8 0 1;... %purple 0 1 1;... %cyan 0.8 0.8 0.8;]; %gray figure(4) fig4on=1; set(4,'Name','Ad-hoc plots') set(gcf,'DefaultAxesColorOrder',MyColorOrder) plot(x,Wdata(1:interval,1: 6)/Gleak,'LineWidth',1); figure(5) if BW==1,set(gcf,'DefaultAxesColorOrder',[0 0 0;.749 0 .749;1 0 0]),end fig5on=1; posit=get(5,'Position'); set(5,'Name','Events','Position',[posit(1) posit(2) posit(3) 75]) %To plot contexts as diff colors all on one line must displace, limit axes & %to 0<1: yA=Eventdata(1:interval,2)-1; yB=Eventdata(1:interval,2)-2; yC=Eventdata(1:interval,2)-3; y0=Eventdata(1:interval,2); yCS1=Eventdata(1:interval,3)*.15+.2; yCS2=Eventdata(1:interval,4)*.15+.4; yUS=Eventdata(1:interval,5)*.15+.6; plot(x,yA,'o','MarkerFaceColor','b','MarkerEdgeColor','b','MarkerSize',5) hold; plot(x,yB,'o','MarkerFaceColor','r','MarkerEdgeColor','r','MarkerSize',5); plot(x,yC,'o','MarkerFaceColor','g','MarkerEdgeColor','g','MarkerSize',5); plot(x,y0,'o', 'MarkerFaceColor','k','MarkerEdgeColor','k', 'MarkerSize',5); plot(x,[yCS1 yCS2 yUS]); %Plot verticle lines at pauses (interrupts): interruptsX=[]; interruptsY=[]; for p=1:interval if Eventdata(p,6)==1 interruptsX=[interruptsX p p]; interruptsY=[interruptsY 0 1]; end %if end %for plot(interruptsX,interruptsY) ylim([0 .9]); xlim([0 Npoints]); figure(2) fig2on=1; set(2,'Name','Vp (red) & Vq (blue)') %plot(x,Net_Actdata(1:interval,1)); plot(x,Net_Actdata(1:interval,1),'r'); hold plot(x,Net_Actdata(1:interval,3),'b'); xlim([0 Npoints]); figure(3) fig3on=1; set(3,'Name','Ap(red),Aq(blue),Af(green)') plot(x,Net_Actdata(1:interval,2),'r'); hold plot(x,Net_Actdata(1:interval,4),'b'); plot(x,Afhist(1:interval,1),'g'); xlim([0 Npoints]); figure(9) fig9on=1; set(9,'Name','Graph of 10*Efactor and Idivisor') plot(x,10*netErecipI(1:interval,1),'r'); hold; plot(x,netErecipI(1:interval,2),'b'); plot(x,10*netErecipI(1:interval,3),'g'); plot(x,netErecipI(1:interval,4),'k'); xlim([0 Npoints]); figure(8) if BW==0 USpoint='r'; USpointEdge='r'; Fcolor='b'; elseif BW==1 USpoint='w'; USpointEdge='r'; Fcolor='k'; end fig8on=1; set(8,'Name','Graph of Fsmrd & Fcs') clear nonusacts nonusacts= Fsmrd(1:interval) - 2*(1-Eventdata(1:interval,5)); %don't know why orientation of Fsmrd is OK hold; plot(x,Fsmrd(1:interval),Fcolor) plot(x,nonusacts(1:interval),'o','MarkerFaceColor',USpoint,'MarkerEdgeColor',USpointEdge,... 'MarkerSize',3) ylim([0 1]); xlim([0 Npoints]); figure(hmain) FigFrontposit =[232 46 560 420]; Fig5posit =[232 46 560 75]; hinfront=2; figure(hinfront) set(hinfront,'Position',FigFrontposit) figure(5) set(5,'Position',Fig5posit) %was 5 %Arrange figures for copying to powerpoint frame figure(5) set(5,'Position',[50 1 950 50]) %Bottom position figure(8) set(8,'Position',[50 50 950 125]) figure(9) set(9,'Position',[50 175 950 125]) figure(2) set(2,'Position',[50 300 950 125 ]) figure(3) set(3,'Position',[50 425 950 125]) figure(4) set(4,'Position',[50 550 950 125]) %Top position %%%%%%%%%%%%%%%%%End of graphing code%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%Special events called from GUI%%%%%%%%%%%%%%%% % --- Executes on button press in Hx. function Hx_Callback(hObject, eventdata, handles) global Hx rNhcA rNhcB rNhcC rNhcA1 rNhcA2 rNhcB1 rNhcB2 rNhcC1 rNhcC2 hHxButton hHxButton=hObject; set(hHxButton,'BackgroundColor','red') rNhcA=0;rNhcB=0;rNhcC=0;rNhcA1=0;rNhcA2=0;rNhcB1=0;rNhcB2=0;rNhcC1=0;rNhcC2=0; Lhc=0; Hx=1; % --- Executes on button press in BLs. function BLs_Callback(hObject, eventdata, handles) global BLs hBLsButton hBLsButton=hObject; if BLs==0 set(hBLsButton,'BackgroundColor','red') BLs=1; elseif BLs==1 set(hBLsButton,'BackgroundColor','white') BLs=0; end % --- Executes on button press in Hs. function Hs_Callback(hObject, eventdata, handles) global Hs hHsButton hHsButton=hObject; if Hs==0 set(hHsButton,'BackgroundColor','red') Hs=1; elseif Hs==1 set(hHsButton,'BackgroundColor','white') Hs=0; end % --- Executes on button press in LAs. function LAs_Callback(hObject, eventdata, handles) global LAs hLAsButton hLAsButton=hObject; if LAs==0 set(hLAsButton,'BackgroundColor','red') LAs=1; elseif LAs==1 set(hLAsButton,'BackgroundColor','white') LAs=0; end % --- Executes on button press in PFCs. function PFCs_Callback(hObject, eventdata, handles) global PFCs hPFCsButton hPFCsButton=hObject; if PFCs==0 set(hPFCsButton,'BackgroundColor','red') PFCs=1; elseif PFCs==1 set(hPFCsButton,'BackgroundColor','white') PFCs=0; end % --- Executes on button press in CEMs. function CEMs_Callback(hObject, eventdata, handles) global CEMs hCEMsButton hCEMsButton=hObject; if CEMs==0 set(hCEMsButton,'BackgroundColor','red') CEMs=1; elseif CEMs==1 set(hCEMsButton,'BackgroundColor','white') CEMs=0; end % --- Executes on button press in consolidate. function consolidate_Callback(hObject, eventdata, handles) %The strategy here is strictly pragmatic. See Supplement, Special Events for explanation. %(FBK note: Extinction Journal May5, 2010 %discusses.) global con il ilHx Gpe Gqe Gie Gje consolidate Gi Gj global E ViMax VjMax VpMax VqMax Gpq global NP NI NT NH HabitBL HabitLA hConsolButton PFCs BLs LAs hConsolButton=hObject; set(hConsolButton,'BackgroundColor','red') consolidate=1; if PFCs==1, return,end NLA=[NP NI NT]; NBL=[NH 1]; ilHx=il; %Calculate Gpe's for cxt inputs of cntxts and conjunctions phi=E/VpMax; for j=1:14 %coefficientBL, etc have 15 elements, but we don't use last element here. if j==4||j==5, continue,end if il(j)>0 && BLs==0 && LAs==0 nBL=NBL(j)*HabitBL(j)*il(j)^2; Aq=(E/VqMax)*nBL*Gqe(j)/(1+nBL*Gqe(j)); nLA=NLA(14*2+j)*HabitLA(14*2+j)*ilHx(j)^2; Gpe(14*2+j)=(1/nLA)*Aq/(phi*(1+Gpq)-Aq*(1+Gpq*phi)); end end %Calcuclate Gie's for cxt inputs cntxts and conjunctions gam=E*Gi/ViMax; for j=1:14 if j==4||j==5, continue,end if il(j)>0 && BLs==0 && LAs==0 nBL=NBL(j)*HabitBL(j)*il(j)^2; nLA=NLA(14*2+j)*HabitLA(14*2+j)*ilHx(j)^2; Aj=(E/VjMax)*nBL*Gje(j)/(1+nBL*Gje(j)); Aq=1/(1+Gj*Aj); Gie(14*2+j)=(1/nLA)*(1-Aq)*(1+Gpq)/(Aq*gam-(1-Aq)*(1+Gpq)); Gje(j)=0; end end for j=1:14 if j==4||j==5, continue,end if il(j)>0 con(j)=1; il(j)=0; end end %%%%%%%%%%%%%%%%%%%%%%%End of Special Events%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%Functions used frequently by above routines%%%%%%%%%%%% %The "Bump" functions are used in calculating factors that determine weight %changes as a function of Ca in inhibitory interneurons and of %back-propagating spike amplitude in principal cells of amygdala. The %linsig function is a linear ramp that starts rising from zero at "start" and %that hits 1 and stays there at "stop". It is used extensively throughout %as an activation function and for other purposes. function y=BumpCa(x,ExponentThrsh,ExponentMxAt,phi) th=ExponentThrsh; ma=ExponentMxAt; ph=phi; y=1-exp(-1*ph*linsig(x,th,ma)); function y=BumpB(x,Thrsh, EndAt) th=Thrsh; ea=EndAt; y=0; if x>th && x<ea, y=1;end function y=linsig(x, start, stop) if x<start y=0; elseif x>=stop y=1; else y=(x-start)/(stop-start); end %%%%%%%%%%%%%%%%%%%%% Some important functions called from GUI %%%%%%%%%%%%%%%%%%%%%% %---Executes on button press in Reset Exp. (i.e New exp on old frat) function resetexp_Callback(hObject, eventdata, handles) global KeepOldFraidy KeepOldFraidy=1; reset_Callback(hObject, eventdata, handles) %i.e. Calls "Reset Fraidy" and %hence intializefraidy %but with KeepOldFraidy flag %set to 1 % --- Executes on button press in RESET. %i.e. "New Fraidy" function reset_Callback(hObject, eventdata, handles) global ContinueAt interrupt global positionFig1 global fig2on fig3on fig4on fig5on fig8on fig9on %fig10on if fig2on==1;close(2);fig2on=0;end if fig3on==1;close(3);fig3on=0;end if fig4on==1;close(4);fig4on=0;end if fig5on==1;close(5);fig5on=0;end if fig8on==1;close(8);fig8on=0;end if fig9on==1;close(9);fig9on=0;end ContinueAt=1;interrupt=0; figure(1) set(1,'Position',positionFig1) initializefraidy % --- Executes on button press in Quit. function Quit_Callback(hObject, eventdata, handles) close all hidden %Used by several other routines. function initializefraidy %Variables evaluated in W_INDEPENDENT EVALUATIONS routine: global inptCS1 inptCS2 inptA inptB inptC global AcxpCS1 AcxpCS2 AcxpA AcxpB AcxpC AcxpA1 AcxpA2 AcxpB1 AcxpB2 AcxpC1 AcxpC2 Scx Lcx global rNcxpCS1 rNcxpCS2 rNcxpA rNcxpB rNcxpC rNcxpA1 rNcxpA2 rNcxpB1 rNcxpB2 rNcxpC1 rNcxpC2 global AcxiA AcxiB AcxiC global rNcxiA rNcxiB rNcxiC global AcxtA AcxtB AcxtC AcxttA1 AcxtA2 AcxtB1 AcxtB2 AcxtC1 AcxtC2 global rNcxtA rNcxtB rNcxtC rNcxtA1 rNcxtA2 rNcxtB1 rNcxtB2 rNcxtC1 rNcxtC2 global AhcA AhcB AhcC AhcA1 AhcA2 AhcB1 AhcB2 AhcC1 AhcC2 Shc Lhc global rNhcA rNhcB rNhcC rNhcA1 rNhcA2 rNhcB1 rNhcB2 rNhcC1 rNhcC2 %Other variables of run_continue global Gpe Gie Gqe Gje global eligibleLA eligibleBL global Fsmrd global ContinueAt netErecipI global interrupt Nrows global Ap Ai Af Sam Lam rNp rNi Ar Aus %rNr rNus Spagd Lpagd rNf Spagv Lpagv global con il ilHx consolidate recalcActs global ilA ilB ilC ilA1 ilA2 ilB1 ilB2 ilC1 ilC2 global ilHxA ilHxB ilHxC ilHxA1 ilHxA2 ilHxB1 ilHxB2 ilHxC1 ilHxC2 global conA conB conC conA1 conA2 conB1 conB2 conC1 conC2 global oldAq oldAu oldAx Ax oldRinput newRinput Au coefficientLA coefficientBL global Wp Wq Ui Uj global usPrv AqPrv %VpI ApI VqI AqI VpII ApII VqII AqII global Fsmrd0 Aop AopPrv global Gp_cem %Variables used for displays and graphing global Wdata Eventdata Net_Actdata Afhist %Init variables associated with in special treatments or GUI input global hConsolButton KeepOldFraidy global BLs Hx Hs LAs PFCs CEMs hBLsButton hHxButton hHsButton hLAsButton hCEMsButton hPFCsButton global hilABCto1Button hilHxABCto1Button %These initial items are done whenever initializefraidy is called, which is %at the start of the program and whenever run/continue is begun.: ContinueAt=1; %Set here and then again every time have New Fraidy interrupt=0; %This is set when read line of Exp and zeroed at reset %SelectedData=zeros(Nrows,5);% not used yet Wdata=zeros(Nrows,6); Eventdata=zeros(Nrows, 6 ); Net_Actdata=zeros(Nrows, 4 ); Afhist=zeros(Nrows,1); Fsmrd=zeros(Nrows, 1 ); netErecipI = zeros(Nrows,4); Fsmrd0=zeros(Nrows,1); recalcActs=0; %The following items are done whenever frat's memory needs to be erased %(i.e NOT continuing a previous experiment) if KeepOldFraidy==0 LAs=0;CEMs=0; BLs=0;Hx=0;Hs=0; PFCs=0; consolidate=0; if hConsolButton>0, set(hConsolButton,'BackgroundColor','white');end if hHxButton>0, set(hHxButton,'BackgroundColor','white');end if hHsButton>0, set(hHsButton,'BackgroundColor','white');end if hBLsButton>0, set(hBLsButton,'BackgroundColor','white');end if hCEMsButton>0, set(hCEMsButton,'BackgroundColor','white');end if hLAsButton>0, set(hLAsButton,'BackgroundColor','white');end if hPFCsButton>0, set(hPFCsButton,'BackgroundColor','white');end if hilABCto1Button>0, set(hilABCto1Button,'BackgroundColor','white');end if hilHxABCto1Button>0, set(hilHxABCto1Button,'BackgroundColor','white');end Gp_cem=0; ilA=0;ilB=0;ilC=0;ilA1=0;ilA2=0;ilB1=0;ilB2=0;ilC1=0;ilC2=0; ilHxA=0;ilHxB=0;ilHxC=0;ilHxA1=0;ilHxA2=0;ilHxB1=0;ilHxB2=0;ilHxC1=0;ilHxC2=0; conA=0;conB=0;conC=0;conA1=0;conA2=0;conB1=0;conB2=0;conC1=0;conC2=0; con=[0 0 0 0 0 0 0 0 0 0 0 0 0 0]; il= [0 0 0 0 0 0 0 0 0 0 0 0 0 0]; ilHx=il; usPrv=0;AqPrv=0; Aop=0; Gpe=zeros(1,14*3); Gie=zeros(1,14*3); Gqe= zeros(1,14+1); Gje=zeros(1,14+1); inptCS1=0; inptCS2=0; inptA=0; inptB=0; inptC=0; AcxpCS1=0; AcxpCS2=0; AcxpA=0; AcxpB=0; AcxpC=0; AcxpA1=0; AcxpA2=0; AcxpB1=0; AcxpB2=0; AcxpC1=0; AcxpC2=0; Scx=0; Lcx=1; rNcxpCS1=1; rNcxpCS2=1; rNcxpA=1; rNcxpB=1; rNcxpC=1; rNcxpA1=1; rNcxpA2=1; rNcxpB1=1; rNcxpB2=1; rNcxpC1=1; rNcxpC2=1; AcxiA=0; AcxiB=0; AcxiC=0; rNcxiA=1; rNcxiB=1; rNcxiC=1; AcxtA=0; AcxtB=0; AcxtC=0; AcxttA1=0; AcxtA2=0; AcxtB1=0; AcxtB2=0; AcxtC1=0; AcxtC2=0; rNcxtA=1; rNcxtB=1; rNcxtC=1; rNcxtA1=1; rNcxtA2=1; rNcxtB1=1; rNcxtB2=1; rNcxtC1=1; rNcxtC2=1; AhcA=0; AhcB=0; AhcC=0; AhcA1=0; AhcA2=0; AhcB1=0; AhcB2=0; AhcC1=0; AhcC2=0; Shc=0; Lhc=1; rNhcA=1; rNhcB=1; rNhcC=1; rNhcA1=1; rNhcA2=1; rNhcB1=1; rNhcB2=1; rNhcC1=1; rNhcC2=1; Ap=0; Ai=0; Sam=0; Lam=1; rNp=1; rNi=1; Ar=0; rNr=1; Aus=0; rNus=1; Af=0; %Spagd=0; eligibleLA=zeros(1,3*14); eligibleBL=zeros(1,14+1); oldAq=0; oldAu=0; oldAx=0; Ax=0; oldRinput=0; newRinput=0; Au=0; AopPrv=0; Wp=zeros(1,3*14); Ui=zeros(1,3*14); Wq=zeros(1,14+1); Uj=zeros(1,14+1); coefficientLA=zeros(1,3*14); coefficientBL=zeros(1,14+1); Af=0; end KeepOldFraidy=0; %////////////////////////////////////////////////////////////////////////// % END OF CODE THAT IS PART OF THE MODEL PROPER %////////////////////////////////////////////////////////////////////////// %%%%%%%%%%%%%%%%%%%%%%%%%%Various Utilities%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % --- Executes on button press in replot (replot & animate code) function replot_Callback(hObject, eventdata, handles) global Eventdata global Fsmrd %Graphs already made so don't need most data arrays. global replotFrom replotTo animateflag global fratnormframes hmain fratshkd3frames StimDur=1500; %1000 points at a 10K sampling rate would be 0.1 sec per interval AnimationInterval=.15; ShortInterval=.02; if animateflag==1 sampfreq=10000; xsound=[1:StimDur]; CS1sound=.2*sin(2*xsound); CS2sound=.4*sin(.5*xsound); for j=1 : StimDur ;USsound(j)=2*(rand-.5);end j=1; %hiThresh=.9 figure(1) hE1=annotation('ellipse',[.2 .8 .1 .15]); hE2=annotation('ellipse',[.7 .2 .1 .15]); %set(hE, 'FaceColor', 'b'); flopped=0; cycles=0; %REMOVE AFTER PROBLEM FIXED JitterArray=[-1 1 1 -1] cs1was=0;cs2was=0; for i=replotFrom : replotTo time1=clock; cs1=Eventdata(i,3); cs2=Eventdata(i,4); us=Eventdata(i,5); cntxt=Eventdata(i,2); if cs1==1 && us==0 %annotation('ellipse',[.5 .8 .1 .1]) %may screw up frame sound(CS1sound,sampfreq) end if cs2==1 && us==0 sound(CS2sound,sampfreq) end if us==1 sound(USsound,sampfreq) end Thresh=rand; Fscore=Fsmrd(i); %end frame selecting if cntxt==1 cntxtColor='r'; elseif cntxt==2 cntxtColor='g'; elseif cntxt==3 cntxtColor='b'; else cntxtColor=[.8 .8 .8]; end if cs1==1 set(hE1,'FaceColor','y'); else set(hE1,'FaceColor',cntxtColor); end if cs2==1 set(hE2,'FaceColor','y'); else set(hE2,'FaceColor',cntxtColor); end if us==0 if Fscore>Thresh j=j; else j=j+1; if j>77, j=1; end end set(1,'Color',cntxtColor) movie(1,fratnormframes(j)) time2=clock; elapsed=etime(time2,time1); while elapsed <AnimationInterval time2=clock; elapsed=etime(time2,time1); end elseif us==1 time2=clock; elapsed=0; k=0; while elapsed<AnimationInterval time3=clock; selapsed=0; %Determine and display next frame k=k+1; j=j+JitterArray(k); set(1,'Color',cntxtColor) movie(1,fratshkd3frames(j)) while selapsed<ShortInterval time4=clock; selapsed=etime(time4,time3); end %while selapsed<ShortInterval time2=clock elapsed=etime(time2,time1) end %while elapsed<AnimationInterval cs1was=cs1;cs2was=cs2; end end %for i=...? set(1,'Color',[.8 .8 .8]) end % if animate==1?? figure(4) axis([replotFrom replotTo -inf inf]) %Vp graph figure(2) axis([replotFrom replotTo -inf inf]) %Ap graph & Af graph figure(3) axis([replotFrom replotTo 0 1]) figure(hmain) %Fsmrd graph figure(8) xlim([replotFrom replotTo]) %Event graphs figure(5) xlim([replotFrom replotTo]) %netE and recip netI graphs figure(9) xlim([replotFrom replotTo]) %Vp graphs figure(2) xlim([replotFrom replotTo]) %Firing rate graph figure(10) xlim([replotFrom replotTo]) %THE FOLLOWING CALLBACK MAKES THE Exp ARRAY WHEN THE SHORT SCHEDULE DONE BUTTON IS CLICKED function SSdonecb(hObject, eventdata) %global NAcq1 CntxtAcq1 CSAcq1 NAcq2 CntxtAcq2 CSAcq2 NExt1 CntxtExt1 CSExt1 %global NExt2 CntxtExt2 CSExt2 NExt3 CntxtExt3 CSExt3 ITI CSdurAcq USdur CSdurExt hshort global Exp SS SSdurations hshort SSrests Exp=[]; %Note: These variables have all been set to zero as default %so that SS will have a full set of entries no matter what user does. %ITIs are time between end of co-terminating CS and/or US and start of next %CS or US, which ever comes first. %To program a US without any CS, let choose CS=0 rather than 1 or 2; CS %(not U&S)duration will be adde3d to ITI. %To program an extinction period without any CSs or USs also let CS=0; CS duration %will be added to ITI. % % SS=[1 NAcq1 CntxtAcq1 CSAcq1;... % 2 NAcq2 CntxtAcq2 CSAcq2;... % 3 NExt1 CntxtExt1 CSExt1;... % 4 NExt2 CntxtExt2 CSExt2;... % 5 NExt3 CntxtExt3 CSExt3]; % SSdurations= [ITI CSdurAcq USdur CSdurExt ACLdur ENDdur]; %SS (short sched) is an array whose rows are, respectively, Aq1,Aq2,Aq3,Ext1,Ext2 (ie. 5 rows) %and whose columns are,respectively, N, cntxt, CS. ITI, csdur, and usdur also are available. %Later I will want to add context aclimitization periods at the start of the exp, but I will do %that later. The following is an algorithm for constructing an %Experiment schedule from ShrtScd: %Experiment entries: % 1 2 3 4 5 6 7 % entry_number,cntxt,cs1,cs2,us,pause,dur k=0; %US=[1 1 0 0 0]; ITI=SSdurations(1); CSdurAcq=SSdurations(2); USdur=SSdurations(3); CSdurExt=SSdurations(4); ACLdur=SSdurations(5); ENDdur=SSdurations(6); Nper1=SS(1,2); Cntxtper1=SS(1,3); CSper1=SS(1,4); Nper2=SS(2,2); Cntxtper2=SS(2,3); CSper2=SS(2,4); Nper3=SS(3,2); Cntxtper3=SS(3,3); CSper3=SS(3,4); Nper4=SS(4,2); Cntxtper4=SS(4,3); CSper4=SS(4,4); Nper5=SS(5,2); Cntxtper5=SS(5,3); CSper5=SS(5,4); for j=1:5 if SS(j,4)<0,CSdur(j)=CSdurAcq; else CSdur(j)=CSdurExt;end end %SumDurations=sum(SSdurations); %old version SumDurations=SSdurations(1)+SSdurations(2)+SSdurations(3)+SSdurations(4)+SSdurations(6); %Construction of Exp array. There are 5 periods to the exp: %Aq1,Aq2,Ext1,Ext2,Ext3. %Each of these is composed of n repetitions of 3 lines, one each for: %ITI, CS period prior to US onset,CS+US period. %NOTE FEB 8, 2009: I AM GOING TO ADD CONTEXT ACCLIMITIZATION PERIODS OF %LENGTH ACLdur at the start of each of these periods if SumDurations>0 %Make new Exp only if there are entries in the short schedule for j=1 : 5 cs1=0;cs2=0;n=0;cntxt=0;us=0; n=abs(SS(j,2)); if n==0, continue, end if SS(j,2)<0 %Insert a pause line in Exp file Exp=[Exp; k+1 0 0 0 0 1 0]; k = k+1; end cntxt=SS(j,3); if abs(SS(j,4))==3 %what is now j was 1, probably erroreously cs1=0; cs2=0; elseif abs(SS(j,4))==1 cs1=1; cs2=0; elseif abs(SS(j,4))==2 cs1=0; cs2=1; end if SS(j,4)<0, us=1;end clear Block Block =... [ cntxt 0 0 0 0 ITI;... cntxt cs1 cs2 0 0 CSdur(j)-USdur;... cntxt cs1 cs2 us 0 USdur]; Block1 =... [ cntxt 0 0 0 0 ITI+ACLdur;... cntxt cs1 cs2 0 0 CSdur(j)-USdur;... cntxt cs1 cs2 us 0 USdur]; clear Z Z=[] ; Z=[Z;Block1]; for m=1:n-1 Z=[Z ;Block]; end ENDPERIOD=[cntxt 0 0 0 0 ENDdur]; Z=[Z;ENDPERIOD]; %clear eventnos %eventnos=[k+1:k+3*n+2] %+2 added on for ACL and ENDPERIOD lines. %Weird: if I place a space after the n in the above equation, the +2 %is interpreted as an extra array element. %Add rests and pre-rest pauses as necessary: extralines=0; if j<5 if SSrests(j)<0 Z=[Z;0 0 0 0 1 0]; extralines=extralines+1; end %deal with interval numbers if abs(SSrests(j))>0 Z=[Z;0 0 0 0 0 abs(SSrests(j))]; extralines=extralines+1; end end clear eventnos %eventnos=[k+1:k+3*n+2+extralines]; %+2 added on for ACL and ENDPERIOD lines. %Weird: if I place a space after the n in the above equation, the +2 %is interpreted as an extra array element. eventnos=[k+1:k+3*n+1+extralines]; %revision for neg ACLs k=length(eventnos); % in prep for next iteration Z=[eventnos' Z]; Exp=[Exp;Z]; end %of iteration j end; %end of make Exp procedure close(hshort) % --- Executes on button press in MakeShortSchd. function MakeShortSchd_Callback(hObject, eventdata, handles) %Here we make all the little edit boxes and a button to say entry is %complete. The boxes are set up here and the callbacks labeled, but the %callbacks for reading the boxes are free-standing click-started %functions. Actually constructing Exp is done by the callback called by %the Done button: %global NAcq1 CntxtAcq1 CSAcq1 NAcq2 CntxtAcq2 CSAcq2 NExt1 CntxtExt1 CSExt1 %global NExt2 CntxtExt2 CSExt2 NExt3 CntxtExt3 CSExt3 ITI CSdurAcq USdur CSdurExt hshort global SS SSdurations hshort SSrests % ITI CSdurAcq USdur CSdurExt %NAcq1=0;CntxtAcq1=0; CSAcq1=0; NAcq2=0; CntxtAcq2=0; CSAcq2=0; NExt1=0; CntxtExt1=0; CSExt1=0; %NExt2=0; CntxtExt2=0; CSExt2=0; NExt3=0; CntxtExt3=0; CSExt3=0; ITI=0; CSdurAcq=0; USdur=0; CSdurExt=0; instruction=[... 'Neg N or Rest =Init pause ';... 'Contexts A, B, or C ';... 'CSs 0,1,or 2; ';... ' + as suffx(no space) =US ';... 'Durations in sec ';... 'ITI ~btw stimuli & bef 1st';... 'US dur=0 for "none" ']; top=500; %was 370 hshort = figure; set(hshort, 'Position',[200 100 545 600]) hinstruction = uicontrol('Style','text','HorizontalAlignment','left','Parent',hshort, 'String',instruction,'Position',[180 200 155 110]); % 180 200 100 100 %%%%%%There follows pairs of labels and edit boxes for filling in%%%%%%%%%% %%%%%% info for Short Sched %%%%% hLabel1=uicontrol('Style','text','Parent',hshort, 'String','N Per1','Position',[20 top 60 20],... 'BackgroundColor','g'); hBox1=uicontrol('Style','edit','Parent',hshort,'String',num2str(SS(1,2)),'Position',[90 top 60 20],'Callback',@box1cb); hLabel2=uicontrol('Style','text','Parent',hshort, 'String','Cntxt Per1','Position',[20 top-20 60 20],... 'BackgroundColor','g'); switch SS(1,3) case 0 entry='0'; case 1 entry='A'; case 2 entry='B'; case 3 entry='C'; end hBox2=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-20 60 20],'Callback',@box2cb); hLabel3=uicontrol('Style','text','Parent',hshort, 'String','CS/US Per1','Position',[20 top-40 60 20],... 'BackgroundColor','g'); SSentry=SS(1,4); if SSentry<0 entry=strcat(num2str(-1*SSentry),'+'); if SSentry==-3, entry='0+';end; else entry=num2str(SSentry); end hBox3=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-40 60 20],'Callback',@box3cb); %%% Insert-line for rest hLabel22=uicontrol('Style','text','Parent',hshort, 'String','Rest1(days)','Position',[20 top-60 60 20]); hBox22=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSrests(1)),'Position',[90 top-60 60 20],'Callback',@box22cb); hLabel4=uicontrol('Style','text','Parent',hshort, 'String','N Per2','Position',[20 top-80 60 20],... 'BackgroundColor','g'); hBox4=uicontrol('Style','edit','Parent',hshort,'String',num2str(SS(2,2)),'Position',[90 top-80 60 20],'Callback',@box4cb); hLabel5=uicontrol('Style','text','Parent',hshort, 'String','Cntxt Per2','Position',[20 top-100 60 20],... 'BackgroundColor','g'); switch SS(2,3) case 0 entry='0'; case 1 entry='A'; case 2 entry='B'; case 3 entry='C'; end hBox5=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-100 60 20],'Callback',@box5cb); hLabel6=uicontrol('Style','text','Parent',hshort, 'String','CS/US Per2','Position',[20 top-120 60 20],... 'BackgroundColor','g'); %NEW STUFF--for transforming info in arrays into box string SSentry=SS(2,4); if SSentry<0 entry=strcat(num2str(-1*SSentry),'+'); if SSentry==-3, entry='0+';end; else entry=num2str(SSentry); end %END NEW STUFF hBox6=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-120 60 20],'Callback',@box6cb); %%% Addition of lines for rests between Periods hLabel23=uicontrol('Style','text','Parent',hshort, 'String','Rest2(days)','Position',[20 top-140 60 20]); hBox23=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSrests(2)),'Position',[90 top-140 60 20],'Callback',@box23cb); hLabel7=uicontrol('Style','text','Parent',hshort, 'String','N Per3','Position',[20 top-160 60 20],... 'BackgroundColor','g'); hBox7=uicontrol('Style','edit','Parent',hshort,'String',num2str(SS(3,2)),'Position',[90 top-160 60 20],'Callback',@box7cb); hLabel8=uicontrol('Style','text','Parent',hshort, 'String','Cntxt Per3','Position',[20 top-180 60 20],... 'BackgroundColor','g'); switch SS(3,3) case 0 entry='0'; case 1 entry='A'; case 2 entry='B'; case 3 entry='C'; end hBox8=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-180 60 20],'Callback',@box8cb); hLabel9=uicontrol('Style','text','Parent',hshort, 'String','CS/US Per3','Position',[20 top-200 60 20],... 'BackgroundColor','g'); SSentry=SS(3,4); if SSentry<0 entry=strcat(num2str(-1*SSentry),'+'); if SSentry==-3, entry='0+';end; else entry=num2str(SSentry); end hBox9=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-200 60 20],'Callback',@box9cb); %%% Insert line for rest hLabel24=uicontrol('Style','text','Parent',hshort, 'String','Rest3(days)','Position',[20 top-220 60 20]); hBox24=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSrests(3)),'Position',[90 top-220 60 20],'Callback',@box24cb); hLabel10=uicontrol('Style','text','Parent',hshort, 'String','N Per4','Position',[20 top-240 60 20],... 'BackgroundColor','g'); hBox10=uicontrol('Style','edit','Parent',hshort,'String',num2str(SS(4,2)),'Position',[90 top-240 60 20],'Callback',@box10cb); hLabel11=uicontrol('Style','text','Parent',hshort, 'String','Cntxt Per4','Position',[20 top-260 60 20],... 'BackgroundColor','g'); switch SS(4,3) case 0 entry='0'; case 1 entry='A'; case 2 entry='B'; case 3 entry='C'; end hBox11=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-260 60 20],'Callback',@box11cb); hLabel12=uicontrol('Style','text','Parent',hshort, 'String','CS/US Per4','Position',[20 top-280 60 20],... 'BackgroundColor','g'); SSentry=SS(4,4); if SSentry<0 entry=strcat(num2str(-1*SSentry),'+'); if SSentry==-3, entry='0+';end; else entry=num2str(SSentry); end hBox12=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-280 60 20],'Callback',@box12cb); %%% Insert line for rest hLabel25=uicontrol('Style','text','Parent',hshort, 'String','Rest4(days)','Position',[20 top-300 60 20]); hBox25=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSrests(4)),'Position',[90 top-300 60 20],'Callback',@box25cb); hLabel13=uicontrol('Style','text','Parent',hshort,'String','N Per5','Position',[20 top-320 60 20,],... 'BackgroundColor','g'); hBox13=uicontrol('Style','edit','Parent',hshort,'String',num2str(SS(5,2)),'Position',[90 top-320 60 20],'Callback',@box13cb); hLabel14=uicontrol('Style','text','Parent',hshort, 'String','Cntxt Per5','Position',[20 top-340 60 20],... 'BackgroundColor','g'); switch SS(5,3) case 0 entry='0'; case 1 entry='A'; case 2 entry='B'; case 3 entry='C'; end hBox14=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-340 60 20],'Callback',@box14cb); hLabel15=uicontrol('Style','text','Parent',hshort, 'String','CS/US Per5','Position',[20 top-360 60 20],... 'BackgroundColor','g'); SSentry=SS(5,4); if SSentry<0 entry=strcat(num2str(-1*SSentry),'+'); if SSentry==-3, entry='0+';end; else entry=num2str(SSentry); end hBox15=uicontrol('Style','edit','Parent',hshort,'String',entry,'Position',[90 top-360 60 20],'Callback',@box15cb); hLabel16=uicontrol('Style','text','Parent',hshort, 'String','ITI','Position',[20 top-380 60 20],... 'BackgroundColor','cyan'); hBox16=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSdurations(1)),'Position',[90 top-380 60 20],'Callback',@box16cb); hLabel17=uicontrol('Style','text','Parent',hshort,'String','CSdurAcq','Position',[20 top-400 60 20,],... 'BackgroundColor','cyan'); hBox17=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSdurations(2)),'Position',[90 top-400 60 20],'Callback',@box17cb); hLabel18=uicontrol('Style','text','Parent',hshort, 'String','USdur','Position',[20 top-420 60 20],... 'BackgroundColor','cyan'); hBox18=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSdurations(3)),'Position',[90 top-420 60 20],'Callback',@box18cb); hLabel19=uicontrol('Style','text','Parent',hshort, 'String','CSdurExt','Position',[20 top-440 60 20],... 'BackgroundColor','cyan'); hBox19=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSdurations(4)),'Position',[90 top-440 60 20],'Callback',@box19cb); %Addition of lines for entering ACLdur and ENDdur hLabel20=uicontrol('Style','text','Parent',hshort, 'String','ACLdur','Position',[20 top-460 60 20],... 'BackgroundColor','cyan'); hBox20=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSdurations(5)),'Position',[90 top-460 60 20],'Callback',@box20cb); hLabel21=uicontrol('Style','text','Parent',hshort, 'String','ENDdur','Position',[20 top-480 60 20],... 'BackgroundColor','cyan'); hBox21=uicontrol('Style','edit','Parent',hshort,'String',num2str(SSdurations(6)),'Position',[90 top-480 60 20],'Callback',@box21cb); hSSdone=uicontrol('String','Done','Parent',hshort,'Position',[180 100 150 40],'Callback',@SSdonecb); %For reference: % SS=[1 0 0 0; 1 2 3 4 % 2 0 0 0; 5 6 7 8 % 3 0 0 0; 9 10 11 12 % 4 0 0 0; 13 14 15 16 % 5 0 0 0]; 17 18 19 20 % SSdurations 1 2 3 4 5 % SSrests 1 2 3 4 %%%%%%%%%%CALLBACKS FOR READING AND ITERPRETING %%%%%%%%%%%%%%% %%%%%%%%%%PROGRAMMING BOXES WHEN THEY ARE FILLED%%%%%%%%%%%%% function box1cb(hObject, eventdata) %Read NPer1 global SS; SS(1,2)=str2double(get(hObject,'string')); function box2cb(hObject, eventdata) %Read CntxtPer1 global SS; value=(get(hObject,'string')); if value=='A' SS(1,3)=1; elseif value=='B' SS(1,3)=2; elseif value=='C' SS(1,3)=3; elseif value=='0' SS(1,3)=0; end function box3cb(hObject, eventdata) %Read CSPer1 Str=get(hObject,'string'); Str=strtrim(Str); if Str(end)=='+' L=length(Str); myCS=-1*str2double(Str(1:L-1)); %if Str=='0+', myCS=-3;end; if cmpstr(Str,'0+')==1, myCS=-3;end else myCS=str2double(Str); end global SS; SS(1,4)=myCS; %Only this line is diff for each entry function box4cb(hObject, eventdata) %Read NPer2 global SS; SS(2,2)= str2double(get(hObject,'string')) ; function box5cb(hObject, eventdata) %Read CntxtPer2 global SS; value=(get(hObject,'string')); if value=='A' SS(2,3)=1; elseif value=='B' SS(2,3)=2; elseif value=='C' SS(2,3)=3; elseif value=='0' SS(2,3)=0; end function box6cb(hObject, eventdata) %Read CSPer2 Str=get(hObject,'string'); Str=strtrim(Str); if Str(end)=='+' L=length(Str); myCS=-1*str2double(Str(1:L-1)); %if Str=='0+', myCS=-3;end; if cmpstr(Str,'0+')==1, myCS=-3;end else myCS=str2double(Str); end global SS; SS(2,4)=myCS; %Only this line is diff for each entry function box7cb(hObject, eventdata) %Read NPer3 global SS; SS(3,2)=str2double(get(hObject,'string')) ; function box8cb(hObject, eventdata) %Read CntxtPer3 global SS value=(get(hObject,'string')); if value=='A' SS(3,3)=1; elseif value=='B' SS(3,3)=2; elseif value=='C' SS(3,3)=3; elseif value=='0' SS(3,3)=0; end function box9cb(hObject, eventdata) %Read CSPer3 Str=get(hObject,'string'); Str=strtrim(Str); if Str(end)=='+' L=length(Str); myCS=-1*str2double(Str(1:L-1)); %if Str=='0+', myCS=-3;end; if cmpstr(Str,'0+')==1, myCS=-3;end else myCS=str2double(Str); end global SS; SS(3,4)=myCS; %Only this line is diff for each entry function box10cb(hObject, eventdata) %Read NPer4 global SS; SS(4,2)=str2double(get(hObject,'string')) ; function box11cb(hObject, eventdata) %Read CntxtPer4 global SS value=(get(hObject,'string')); if value=='A' SS(4,3)=1; elseif value=='B' SS(4,3)=2; elseif value=='C' SS(4,3)=3; elseif value=='0' SS(4,3)=0; end function box12cb(hObject, eventdata) %Read CSPer4 Str=get(hObject,'string'); Str=strtrim(Str); if Str(end)=='+' L=length(Str); myCS=-1*str2double(Str(1:L-1)); %if Str=='0+', myCS=-3;end; if cmpstr(Str,'0+')==1, myCS=-3;end else myCS=str2double(Str); end global SS; SS(4,4)=myCS; %Only this line is diff for each entry function box13cb(hObject, eventdata) %Read NPer5 global SS; SS(5,2)=str2double(get(hObject,'string')) ; function box14cb(hObject, eventdata) %Read CntxtPer5 global SS; value=(get(hObject,'string')); if value=='A' SS(5,3)=1; elseif value=='B' SS(5,3)=2; elseif value=='C' SS(5,3)=3; elseif value=='0' SS(5,3)=0; end function box15cb(hObject, eventdata) %Read CSPer5 Str=get(hObject,'string'); Str=strtrim(Str); if Str(end)=='+' L=length(Str); myCS=-1*str2double(Str(1:L-1)); %if Str=='0+', myCS=-3;end; if cmpstr(Str,'0+')==1, myCS=-3;end else myCS=str2double(Str); end global SS; SS(5,4)=myCS; %Only this line is diff for each entry function box16cb(hObject, eventdata) %Read ITI global SSdurations; SSdurations(1)= str2double(get(hObject,'string')); function box17cb(hObject, eventdata) %Read CSdurAcq global SSdurations; SSdurations(2)= str2double(get(hObject,'string')); function box18cb(hObject, eventdata) %Read USdur global SSdurations; SSdurations(3)= str2double(get(hObject,'string')); function box19cb(hObject, eventdata) %Read CSdurExt global SSdurations; SSdurations(4)= str2double(get(hObject,'string')); function box20cb(hObject, eventdata) %Read ACLdur (Acclimitization in front of 1st ITI global SSdurations; SSdurations(5)= str2double(get(hObject,'string')); function box21cb(hObject, eventdata) %Read ENDdur global SSdurations; SSdurations(6)= str2double(get(hObject,'string')); %Rest 1 function box22cb(hObject, eventdata) global SSrests; SSrests(1)= str2double(get(hObject,'string')); %Rest 2 function box23cb(hObject, eventdata) global SSrests; SSrests(2)= str2double(get(hObject,'string')); %Rest 3 function box24cb(hObject, eventdata) global SSrests; SSrests(3)= str2double(get(hObject,'string')); %Rest 4 function box25cb(hObject, eventdata) global SSrests; SSrests(4)= str2double(get(hObject,'string')); %%%End of code for reading and interpreting Short Schedule boxes.%%%% % --- Executes on button press in MakeLongSchd. function MakeLongSchd_Callback(hObject, eventdata, handles) global Exp SchedFname hSchedFnameBox Exp=[]; %LOAD EXTERNAL FILE. %Note: This routine sets the matrix Exp equal to the array in a file with %a .txt extension that has been prepared by entering the array elements %into an excel spread sheet and saving as a text file located (presently) %in the current working directory (but a different path can be specified %in the next line. At present it gets restored in binary file along with %the SS array if one hits Save. FullFname=strcat(SchedFname,'.txt'); Exp=load(FullFname); pause(.25) set(hSchedFnameBox,'BackgroundColor','white') set(hSchedFnameBox,'BackgroundColor','red') pause(.25) set(hSchedFnameBox,'BackgroundColor','white') % --- Executes on button press in KeepSchd. function KeepSchd_Callback(hObject, eventdata, handles) global Exp SchedFname hSchedFnameBox SS SSdurations SSrests pause(.25) set(hSchedFnameBox,'BackgroundColor','white') set(hSchedFnameBox,'BackgroundColor','red') pause(.25) set(hSchedFnameBox,'BackgroundColor','white') % 'Here are Frank & SS in Keep' % Frank % SS Experiment=Exp; %This is to avoid confusing local and global variables, etc. save(SchedFname, 'Experiment','SS','SSdurations','SSrests') %would other format have assumed .mat? % --- Executes on button press in GetSchd. function GetSchd_Callback(hObject, eventdata, handles) global Exp SchedFname hSchedFnameBox SS SSdurations SSrests load(SchedFname) %.mat is assumed by this format. %"load SchedFname" looks for a file with the name "SchedFname". . Exp=Experiment; %Experiment is whatthe saved Exp files are called in .mat files set(hSchedFnameBox,'BackgroundColor','red') pause(.25) set(hSchedFnameBox,'BackgroundColor','white') % GetButtonBlinksRed %Probably can discard this function function GetButtonBlinksRed global hSchedFnameBox set(hSchedFnameBox,'BackgroundColor','red') %pause(.25) %set(hSchedFnameBox,'BackgroundColor','white') % --- Executes on button press in animate. function animate_Callback(hObject, eventdata, handles) global animateflag animateflag = get(hObject,'Value'); % --- Executes on button press in goKeyboard. function goKeyboard_Callback(hObject, eventdata, handles) global alphaLA betaLA etaLA zetaLA alphaBL betaBL etaBL zetaBL Gus global Gi Gj Gr Gpq VpMax VqMaxCa VqMax ViMax VjMax global opThrsh pi global startLTPfactorLA startLTPfactorBL a b c d morphine oldAu oldAq global psec ArMultLA ArMultBL maxsec Gpe Gqe Gie Gje ilIncr ilHxIncr ilIncrCmpnd ilHxIncrCmpnd thrshElig naloxone global PFCx BLs global Grp Grq global ilTau ilExp ilCmpndTau ilCmpndExp global ilHxTau ilHxExp ilHxCmpndTau ilHxCmpndExp global mx mxHx global NP NH NI NT NI NH global NPcntxt NPcs NPcntxt_cs NPcntxt_0 global NHcntxt NHcs NHcntxt_cs NHcntxt_0 global NIcntxt NIcs NIcntxt_cs NIcntxt_0 global NTcntxt NTcntxt_cs NTcntxt_0 Np global Gp_cem BLs Gp_cemON PAGptx PAGmuscimol global thrshRp thrshRi thrshRq thrshRj thrshXp endXp thrshXq endXq thrshXi phiXi thrshXj phiXj disp('///////////////////////////////////////////////////////////////////////////////') disp('alphaLA betaLA etaLA zetaLA') disp([alphaLA betaLA etaLA zetaLA]) disp('alphaBL betaBL etaBL zetaBL') disp([alphaBL betaBL etaBL zetaBL]) disp('Gi Gj Gr Gpq Gp_cemON') disp([Gi Gj Gr Gpq Gp_cemON]) disp('VpMax VqMaxCa VqMax NTcntxt_cs ') disp([VpMax VqMaxCa VqMax NTcntxt_cs]) disp('ViMax VjMax psec maxsec') disp([ViMax VjMax psec maxsec]) disp('opThrsh pi startLTPfactorLA startLTPfactorBL') disp([opThrsh pi startLTPfactorLA startLTPfactorBL]) disp('NPcntxt NTcntxt NHcntxt NHcntxt_cs ') disp([NPcntxt NTcntxt NHcntxt NHcntxt_cs ]) disp('a b c d') disp([a b c d]) disp('ilTau ilExp ilCmpndTau ilCmpndExp ilHxTau ilHxExp ilHxCmpndTau ilHxCmpndExp') disp([ilTau ilExp ilCmpndTau ilCmpndExp ilHxTau ilHxExp ilHxCmpndTau ilHxCmpndExp ]) disp('thrshElig NPcntxt_cs Grp Grq') disp([thrshElig NPcntxt_cs Grp Grq]) disp('mx mxHx ArMultLA ArMultBL') disp([mx mxHx ArMultLA ArMultBL]) disp ('PAGptx PAGmuscimol') disp ([PAGptx PAGmuscimol]) disp('///////////////////////////////////////////////////////////////////////////////') keyboard NP=[NPcntxt NPcntxt NPcntxt NPcs NPcs NPcntxt_cs NPcntxt_cs NPcntxt_cs NPcntxt_cs NPcntxt_cs NPcntxt_cs NPcntxt_0 NPcntxt_0 NPcntxt_0]; NH=[NHcntxt NHcntxt NHcntxt NHcs NHcs NHcntxt_cs NHcntxt_cs NHcntxt_cs NHcntxt_cs NHcntxt_cs NHcntxt_cs NHcntxt_0 NHcntxt_0 NHcntxt_0]; NI=[NIcntxt NIcntxt NIcntxt NIcs NIcs NIcntxt_cs NIcntxt_cs NIcntxt_cs NIcntxt_cs NIcntxt_cs NIcntxt_cs NIcntxt_0 NIcntxt_0 NIcntxt_0]; NT=[NTcntxt NTcntxt NTcntxt 0 0 ... NTcntxt_cs NTcntxt_cs NTcntxt_cs NTcntxt_cs NTcntxt_cs NTcntxt_cs NTcntxt_0 NTcntxt_0 NTcntxt_0]; NI=NI; NH=NH; function ReplotFrom_Callback(hObject, eventdata, handles) % str2double(get(hObject,'String')) returns contents of ReplotFrom as a double clear global replotFrom global replotFrom replotFrom=str2double(get(hObject,'String')); function Replotto_Callback(hObject, eventdata, handles) % str2double(get(hObject,'String')) returns contents of Replotto as a double clear global replotTo global replotTo replotTo=str2double(get(hObject,'String')); function ReplotApYmax_Callback(hObject, eventdata, handles) % Hints: get(hObject,'String') returns contents of ReplotApYmax as text % str2double(get(hObject,'String')) returns contents of ReplotApYmax as a double function SchedFname_Callback(hObject, eventdata, handles) global SchedFname hSchedFnameBox SchedFname=get(hObject,'String'); hSchedFnameBox=hObject; function shockIntensity_Callback(hObject, eventdata, handles) global Ishk Ishk= str2double(get(hObject,'String')); %In order to pre-familiarize FRAT to contexts A, B, and C without writing %this explicitly into schedules for experiments, the following GUI-called %functions are available. The first sets a flag that causes all new calle %of Run/Continue to set il values (but not ilHx values) to unity. The %other two explicitly set set either il or ilHx values to one. All il %values are reset to zero when New Fraidy is requested. %Sets flag so ilA,B,&C set to 1 at start of each new call to Run/Continue %routine. il ABC reset to zero when New Fraidy (Reset) called. function prfmcntxts_Callback(hObject, eventdata, handles) global FamAllCntxts FamAllCntxts=get(hObject,'Value'); % --- Executes on button press in ilABCto1. Sets ilA,B,C to 1 for current frat only. function ilABCto1_Callback(hObject, eventdata, handles) global il ilA ilB ilC hilABCto1Button hilABCto1Button=hObject; set(hilABCto1Button,'BackgroundColor','red') ilA=1;il(1)=1; ilB=1;il(2)=1; ilC=1;il(3)=1; % --- Executes on button press in ilHxABCto1. Sets ilHxA,B,C to 1 for current frat only. function ilHxABCto1_Callback(hObject, eventdata, handles) global ilHx ilHxA ilHxB ilHxC hilHxABCto1Button hilHxABCto1Button=hObject; set(hilHxABCto1Button,'BackgroundColor','red') ilHxA=1;ilHx(1)=1; ilHxB=1;ilHx(2)=1; ilHxC=1;ilHx(3)=1; function pcentHs_Callback(hObject, eventdata, handles) global pcentHs pcentHs=str2double(get(hObject,'String')); %///////////////////////////////////////////////////////////////////////// % Create function entries and possibly some obsolete stuff %/////////////////////////////////////////////////////////////////////// % --- Executes during object creation, after setting all properties. function pcentHs_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes during object creation, after setting all properties. function Type_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes during object creation, after setting all properties. function edit13_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes during object creation, after setting all properties. function edit14_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit13_Callback(hObject, eventdata, handles) function edit14_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function shockIntensity_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes during object creation, after setting all properties. function Replotto_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function SchedFname_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes during object creation, after setting all properties. function ReplotFrom_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function ReplotApYmax_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end