\ DRL.MPC \ Inputs ^LeftLever = 1 ^RightLever = 2 \ Outputs ^Pellet = 3 \ If both Pellet and Dipper are being used ^Dipper = 3 \ It will be necessary to change one of these ^LeftLight = 4 ^RightLight = 5 ^HouseLight = 7 ^Pump = 8 \ Constants ^Left = 1 ^Right = 2 ^PrevTrial = -5 ^NextTrial = 5 \ A() = Control Variables with Assigned Aliases as defined Var_Alias Correct Lever (L=1 R=2) = A(0) Var_Alias Reward (Pellet=1 Dipper=2 Drug=3) = A(1) Var_Alias Reward Time (sec) = A(2) Var_Alias Time Out following Reward = A(3) Var_Alias Session Time (Min) = A(4) Var_Alias Inter-Response Time (Sec) = A(5) Var_Alias Maximum Reinforcers = A(6) Var_Alias SoftCR Data Array (Yes=1 No=0) = A(7) \ Constants for Control Variables Array ^CorLever = 0 ^Reward = 1 ^RewTime = 2 ^TimeOut = 3 ^SessTime = 4 ^IRT = 5 ^MaxReinf = 6 ^SoftCR = 7 ^RewTimeTicks = 8 ^TimeOutTicks = 9 ^IRTTicks = 10 \ List Data Variables Here \ B() = Trial Data \ B(0) = Total Responses \ B(1) = Correct Response Count \ B(2) = Incorrect Response Count \ B(3) = % Correct \ B(4) = % Incorrect \ B(J) = Trial Number \ B(J+1) = Correct Responses \ B(J+2) = Incorrect Responses \ B(J+3) = Pause (sec) \ B(J+4) = Run Time (sec) \ Constants for Trial Data Array ^Total = 0 ^Correct = 3 ^Incorrect = 4 ^Trial = 0 ^CorResp = 1 ^IncorResp = 2 ^Pause = 3 ^RunTime = 4 \ C() = IRT Array and Event Pen Code for Soft Cum. Recorder \ F = Total Rewards \ List Working Variables Here \ I = Subscript for the IRT Array C \ J = Subscript for the Trial Array B \ K = Elapsed Time in Session \ L = Ratio Count \ T = Elapsed Time in 0.1 sec increments for SoftCR Data DIM A = 10 DIM B = 205 DIM C = 10000 \ Dimension Array C for 10001 data points. \ Under MED-PC Version IV, this array may be \ enlarged up to 1 million elements; however, \ 10,000 was felt to be adequate for this application. \ An end of array seal -987.987 will limit the saved \ file to only those elements used during the running \ of the procedure. \ Z-PULSES USED IN THIS PROGRAM \ Z1 = Pellet Reinforcement Signal \ Z2 = Dipper Reinforcement Signal \ Z3 = Pump Reinforcement Signal \ Z5 = End of Session Signal ^End = 5 DISKCOLUMNS = 5 \*************************************************** \ IRT LESS SCHEDULE \ S1 - Set Default Values \ Left Lever Correct (1) \ Reward Device Pellet (1) \ Reward Time (0.05 seconds) \ Time Out following Reward (0 seconds) \ Session Time (60 minutes) \ Inter-Response Time (5 seconds) \ Maximum Reinforcers (50) \ SoftCR Activation (1-Yes) \*************************************************** S.S.1, S1, 0.001": SET A(^CorLever) = 1, A(^Reward) = 1, A(^RewTime) = 0.05; SET A(^TimeOut) = 0, A(^SessTime) = 60, A(^IRT) = 5; SET A(^MaxReinf) = 50, A(^SoftCR) = 1, J = 5, B(J) = -987.987 ---> S2 S2, \ First Statement: Wait for START signal, turn houselight ON, \ test for correct lever and turn associated stimulus ON. \ \ Second Statement: Update screen display with default values \ for control variables. This will show any change made \ via the "Configure | Change Variables" Window prior to START. #START: CLEAR 1,60; SET A(^RewTimeTicks) = A(^RewTime) * 1", A(^TimeOutTicks) = A(^TimeOut) * 1"; SET A(^IRTTicks) = A(^IRT) * 1", B(J+^Trial) = 1, B(J+^NextTrial) = -987.987; SHOW 2,Tot Cor Rsp,B(^CorResp), 3,Tot Incor Rsp,B(^IncorResp), 4,Reward,F; SHOW 6,Trial #,B(J+^Trial), 7,Cor Rsp,B(J+^CorResp), 8,Incor Rsp,B(J+^IncorResp); ON ^HouseLight, ^LeftLight, ^Rightlight ---> S3 1": SHOW 1,Lever Code,A(^CorLever), 2,Reward,A(^Reward), 3,Reward Time,A(^RewTime); SHOW 4,Timeout,A(^TimeOut), 5,Session Time,A(^SessTime), 6,Inter-Response Time,A(^IRT); SHOW 7,Max Reinforcers,A(^MaxReinf), 8,SoftCR Code,A(^SoftCR) ---> SX S3, \ Look for First Lever Press #RA(^CorLever): ADD B(^Total), B(^CorResp), B(J+^CorResp); SHOW 2,Tot Cor Rsp,B(^CorResp), 7,Cor Rsp,B(J+^CorResp) ---> S4 #R^RightLever: ADD B(^Total), B(^IncorResp), B(J+^IncorResp); SHOW 3,Tot Incor Rsp,B(^IncorResp), 8,Incor Rsp,B(J+^IncorResp) ---> SX #Z^End: ---> S10 S4, \ Wait A(^IRT) Time, Reset if Lever Press Occurs A(^IRTTicks)#T: ---> S5 #RA(^CorLever): ADD B(^Total), B(^CorResp), B(J+^CorResp); SHOW 2,Tot Cor Rsp,B(^CorResp), 7,Cor Rsp,B(J+^CorResp) ---> S4 #R^RightLever: ADD B(^Total), B(^IncorResp), B(J+^IncorResp); SHOW 3,Tot Incor Rsp,B(^IncorResp), 8,Incor Rsp,B(J+^IncorResp) ---> SX #Z^End: ---> S10 S5, \ Wait for Correct Lever Press #RA(^CorLever): ADD B(^Total), B(^CorResp), B(J+^CorResp); SHOW 2,Tot Cor Rsp,B(^CorResp), 7,Cor Rsp,B(J+^CorResp); ADD F; SHOW 4,Reward,F; ZA(^Reward) ---> S6 #R^RightLever: ADD B(^Total), B(^IncorResp), B(J+^IncorResp); SHOW 3,Tot Incor Rsp,B(^IncorResp), 8,Incor Rsp,B(J+^IncorResp) ---> SX #Z^End: ---> S10 S6, \ Time out Interval Following Reward A(^TimeOutTicks)#T: IF F >= A(^MaxReinf) [@End, @cont] @End: Z^End; SET B(J) = -987.987 ---> S10 @Cont: SET B(J+^Trial) = B(J+^PrevTrial) + 1; SHOW 6,Trial #,B(J+^Trial) ---> S4 #Z^End: ---> S10 S10, \ End of Session - Turn lights off \ Calculate % Vorrect and % Incorrect. 0.01": OFF ^HouseLight, ^LeftLight, ^RightLight; IF B(^Total) = 0 [@Nocalc, @Calculate] @NoCalc: ---> S11 @Calculate: SET B(^Correct) = B(^CorResp) / B(^Total); SET B(^Incorrect) = B(^IncorResp) / B(^Total) ---> S11 S11, \ Holding state at end of session. 1': ---> SX \********************************************* \ REWARD CONTROL TIMER \********************************************* S.S.3, S1, #Z1: ON ^Pellet ---> S2 #Z2: ON ^Dipper ---> S2 #Z3: ON ^Pump ---> S2 S2, \ Time Reward Device for A(^RewTime) seconds \ Default value set in S.S.1, S1 & S2. A(^RewTimeTicks)#T: OFF ^Pellet, ^Dipper, ^Pump ---> S1 \*********************************************** \ PAUSE AND RUN TIME TIMING \*********************************************** S.S.10, S1, #START: ---> S2 S2, #RA(^CorLever): ---> S3 S3, 1": ADD B(J+^RunTime) ---> S3 #ZA(^Reward): SHOW 10,Run Time,B(J+^RunTime); SET J = J + 5, B(J+^NextTrial) = -987.987 ---> S4 S4, #RA(^CorLever): SHOW 9,Pause,B(J+^Pause) ---> S3 1": ADD B(J+^Pause) ---> S4 \*********************************************** \ INCREMENT TIME T FOR IRT AND EVENT ARRAY \*********************************************** S.S.15, S1, #START: IF A(^SoftCr) > 0 [] ---> S2 S2, 0.1": ADD T ---> SX #Z^End: ---> S1 \********************************************************* \ ADD A STEP ELEMENT TO ARRAY C FOR EACH CORRECT RESPONSE \********************************************************* S.S.17, S1, #START: IF A(^SoftCR) = 1 [@ActivateSoftCR, @NoSoftCR] @ActSoftCR: IF A(^CorLever) = 1 [@LeftLeverCorrect, @RightLeverCorrect] @LeftCorrect: ---> S2 @RightCorrect: ---> S3 @NoSoftCR: ---> SX S2, \ Left Lever Correct #R^LeftLever: SET C(I) = T + 0.1, T = 0; ADD I; IF I = 10000 [@True, @False] @True: ---> S1 @False: SET C(I) = -987.987 --->SX #Z^End: ---> S1 S3, \ Right Lever Correct #R^RightLever: SET C(I) = T + 0.1, T = 0; ADD I; IF I = 10000 [@True, @False] @True: ---> S1 @False: SET C(I) = -987.987 ---> SX #Z^End: ---> S1 \***************************************************** \ ADD A PIP ELEMENT TO ARRAY C FOR EACH REWARD \***************************************************** S.S.19, S1, #START: IF A(^SoftCR) = 1 [@ActivateSoftCR, @NoSoftCR] @ActSoftCR: ---> S2 @NoSoftCR: ---> SX S2, #Z1 ! #Z2 ! #Z3: SET C(I) = T + 0.2, T = 0; ADD I; IF I = 10000 [@True, @False] @True: ---> S1 @False: SET C(I) = -987.987 ---> SX #Z^End: SET C(I) = T + 0.31, T = 0, I = I + 1, C(I) = -987.987 ---> S1 \************************************************************** \ ADD AN EVENT ELEMENT TO ARRAY C FOR EACH INCORRECT RESPONSE \ ADDITIONAL EVENT ELEMENTS MAY BE ADDED AS NEEDED \ FOR EXAMPLE TO MARK TIME OUT INTERVALS. \************************************************************** S.S.21, S1, #START: IF A(^SoftCR) = 1 [@ActivateSoftCR, @NoSoftCR] @ActSoftCR: SET C(I) = 0.50, I = I + 1, C(I) = -987.987; IF A(^CorLever) = ^Right [@LeftLeverIncorrect, @RightLeverIncorrect] @LeftIncorrect: ---> S2 @RightIncorrect: ---> S3 @NoSoftCR: SET C(0) = -987.987 ---> SX \ Seal Array S2, \ Left Lever Incorrect #R^LeftLever: SET C(I) = T + 0.60, C(I+1) = 0.50, T = 0, I = I + 2; IF I >= 10000 [@True, @False] @True: ---> S1 @False: SET C(I) = -987.987 ---> SX #Z^End: ---> S1 S3, \ Right Lever Incorrect #R^RightLever: SET C(I) = T + 0.60, C(I+1) = 0.50, T = 0, I = I + 2; IF I >= 10000 [@True, @False] @True: ---> S1 @False: SET C(I) = -987.987 ---> SX #Z^End: ---> S1 \********************************************* \ SESSION CLOCK \********************************************* S.S.23, S1, #START: SHOW 1,Session,K ---> S2 S2, 1": ADD K; SHOW 1,Session,K/60; IF K/60 >= A(^SessTime) [@EndSession, @ContinueTiming] @END: Z^End ---> S3 @Cont: ---> SX #Z^End: ---> S3 S3, \ Wait for screen update and end with \ STOPABORTFLUSH for automatic data saving. A(^RewTimeTicks)#T: ---> STOPABORTFLUSH