\ Copyright (c) 2013 MEDState Notation Repository, All rights reserved. \ ProgressiveRatio_v2.mpc \ \ When the program is started it will turn on the HouseLight and the lights over \ both Levers, and the current PR Value will be set to the first value drawn in \ order from List Z. The program will then wait for the Animal to respond on \ the Correct Lever enough times to meet the current PR Value. \ \ When the current PR Value has been met the program will turn on the Reward \ Device for the Reward Time. At the end of the Reward Time the program will \ time the Time Out Following Reward. \ \ When the Time Out Following Reward has been completed the program set the \ current PR Value to the next value drawn in order from List Z. \ \ The program will then once again wait for the Animal to respond on the Correct \ Lever enough times to meet the current PR Value. \ The program will end when the Session Length has been reached. \ Inputs ^LeftLever = 1 ^RightLever =3 \ Outputs ^Pellet = 3 ^LeftLight = 4 ^LeftLeverOperate= 1 ^HouseLight = 7 ^Fan = 9 ^RightLight = 5 ^RightLeverOperate = 2 \ A() = Control Variables with Assigned Aliases as Defined Var_Alias Session Length (min) = A(0) \ Default = 300 minutes Var_Alias Correct Lever (1=Left 2=Right) = A(1) \ Default = 1-Left Var_Alias Reward Device (1=Pellet 2=Dipper 3=Pump) = A(2) \ Default = 1-Pellet Var_Alias Reward Time (sec) = A(3) \ Default = 0.05 seconds Var_Alias Time Out Following Reward (sec) = A(4) \ Default = 20 seconds Var_Alias SoftCR Data Array (1=Yes 0=No) = A(5) \ Default = 1-Yes ^Session = 0 ^CorrectLev = 1 ^RewardDevice = 2 ^RewardTime = 3 ^TimeOut = 4 ^SoftCR = 5 ^RewardTicks = 6 ^TimeOutTicks = 7 \ List Data Variables Here \ B() = Response Counts \ B(0) = Total Responses \ B(1) = Total Correct Response Count \ B(2) = Total Incorrect Response Count \ B(3) = Total Rewards \ B(4) = % Correct \ B(5) = % Incorrect \ B(6) = Last PR Value that was Met \ List Working Variables Here \ I = Subscript for the IRT Array C \ P = Current PR Value \ R = Ratio Response Counter \ S = Elapsed Time in Session \ X = Subscript for Progressive Ratio List Z \ Z() = Progressive Ratio Default List DIM A = 7 DIM B = 6 LIST Z = 1, 2, 4, 6, 9, 12, 15, 20, 25, 32, 40, 50, 62, 77, 95, 118, 145, 178, 219, 268, 328, 402, 492, 603, 737, 901, 1102, 1347, 1646, 2012 \ Z-Pulses Used in this Program ^Z_Pellet = 1 \ Signal Pellet Reinforcement ^Z_Dipper = 2 \ Signal Dipper Reinforcement ^Z_Pump = 3 \ Signal Pump Reinforcement ^Z_EndReward = 4 \ Signal End of Reward ^Z_End = 32 \ Signal End of Session \*************************************************** \ Progressive Ratio Schedule \ S1 - Set Default Values \ Session Length (300 minutes) \ Correct Lever (1-Left) \ Reward Device (1-Pellet) \ Reward Time (0.05 seconds) \ Time Out Following Reward (20 seconds) \ SoftCR Data Array (1-Yes) \*************************************************** S.S.1, S1, 0.01": SET A(^Session) = 300, A(^CorrectLev) = 1, A(^RewardDevice) = 1; SET A(^RewardTime) = 0.05, A(^TimeOut) = 20, A(^SoftCR) = 1 ---> S2 S2, 0.001": ON ^fan ---> S3 S3, \ First Statement: Wait for START signal, turn HouseLight ON \ and turn associated stimulus ON. \ \ Second Statement: Update screen display with default values \ for Control Variables. This will show any changes made via \ the "Configure | Change Variables" Window prior to START. #START: CLEAR 1,200; SET A(^RewardTicks) = A(^RewardTime) * 1"; SET A(^TimeOutTicks) = A(^TimeOut) * 1"; ON ^HouseLight, ^LeftLight, ^LeftLever, ^RightLeverOperate; SHOW 1,Session,S/300 ---> S4 1": SHOW 1,Session Length,A(^Session), 2,Correct Lever,A(^CorrectLev), 3,Reward Device,A(^RewardDevice); SHOW 4,Reward Time,A(^RewardTime), 5,Time Out,A(^TimeOut), 6,SoftCR Code,A(^SoftCR) ---> SX S4, \ Time Session Length 0.01": SET S = S + 0.01; SHOW 1,Session,S/300; IF S/60 >= A(^Session) [@EndSession, @ContinueTiming] @End: Z^Z_End ---> S5 @Cont: ---> SX S5, \ Wait for Screen Update and end with \ STOPABORTFLUSH for Automatic Data Saving 2": ---> STOPABORTFLUSH \*************************************************** \ MAIN PROGRAM \*************************************************** S.S.2, S1, \ Draw first Progressive Ratio from List Z #START: LIST P = Z(X) ---> S2 S2, \ Test for Correct Lever #RA(^CorrectLev): ADD B(0), B(1), R; IF R >= P [@PR_Value_Met, @False] @PR_Met: ADD B(3); SET B(6) = P, R = 0; ZA(^RewardDevice) ---> S3 @False: ---> SX #R^RightLever: ADD B(0), B(2) ---> SX #Z^Z_End: ---> S5 S3, \ Wait for End of Reward Signal #Z^Z_End: ---> S5 #Z^Z_EndReward: ---> S4 S4, \ Time Out Interval Following Reward \ Update Progressive Ratio P from LIST Z A(^TimeOutTicks)#T: ON ^HouseLight, ^LeftLight, ^LeftLeverOperate, ^RightLeverOperate; LIST P = Z(X) ---> S2 #Z^Z_End: ---> S5 S5, \ End of Session - Turn Lights Off \ Calculate % Correct and % Incorrect 0.01": OFF ^HouseLight, ^LeftLight, ^LeftLeverOperate, ^RightLeverOperate; IF B(0) = 0 [@NoCalc, @Calculate] @NoCalc: ---> S6 @Calculate: SET B(4) = B(1) / B(0) * 100; SET B(5) = B(2) / B(0) * 100; SHOW 7,% Correct,B(4), 8,% Incorrect,B(5), 10,Last PR Met,B(6) ---> S6 S6, \ Holding State at End of Session 1': ---> SX \*************************************************** \ REWARD CONTROL TIMER \*************************************************** S.S.3, S1, 60': Z^Z_End ---> STOPABORTFLUSH \ End if no reward received in 60 minutes #Z^Z_Pellet: ON ^Pellet; OFF ^HouseLight, ^LeftLeverOperate, ^LeftLight, ^RightLeverOperate ---> S2 S2, \ Time Reward Device for A(^RewardTime) seconds \ Default value set in S.S.1, S1 & S2 A(^RewardTicks)#T: OFF ^Pellet; Z^Z_EndReward ---> S1 \*************************************************** \ UPDATE DISPLAY \*************************************************** S.S.4, S1, #START: SHOW 2,Correct Rsp,B(1), 3,Incorrect Rsp,B(2), 4,Rewards,B(3), 5,PR Value,P ---> S2 S2, 1": SHOW 2,Correct Rsp,B(1), 3,Incorrect Rsp,B(2), 4,Rewards,B(3), 5,PR Value,P ---> S2