#pragma rtGlobals=1 // Use modern global access method. // Function for running the simulation. Function GerkinSimulate(ctrlName) String ctrlName // Access all the global variables (the simulation parameters) SetDataFolder root:Parameters NVar duration // in milliseconds. NVar frequency // stimulus frequency in Hz. NVar pulse_width // width of the pulse (AB or BA) in milliseconds. NVar ab_on,ba_on NVar timing // The timing in between doublets, ba - ab, in milliseconds. NVar dt // Simulation time-scale, in milliseconds. NVar p_off,d_off,v_off,lambda,p_steep,d_steep,w_off,NR2A,NR2B // Initialize the waves that track the evolution of the dynamics variables. SetDataFolder root: Variable time_steps=duration/dt Make /o /n=(time_steps) AB_=0,BA_=0,P_=0,D_=0,V_=0,W_=0 SetScale /P x,0,dt,AB_,BA_,P_,D_,V_,W_ Variable t // Tracks time in milliseconds. // Set stimulus waves AB and BA according to the parameters. Variable thyme=1000/(2*frequency) Variable point_timing=round(timing/dt) Variable point_width=round(pulse_width/dt) for(t=0;t<time_steps;t+=1) thyme+=dt if(thyme>1000/frequency) AB_[t,t+point_width-1]=ab_on ? 1 : 0 BA_[t+point_timing,t+point_timing+point_width-1]=ba_on ? 1 : 0 thyme=0 endif endfor // Run simulation. for(t=1;t<time_steps;t+=1) P_[t]=P_[t-1]+dt* (AB_[t] - p_off*P_[t-1])*NR2A D_[t]=D_[t-1]+dt* (BA_[t] + AB_[t] - d_off*(D_[t-1] + lambda*V_[t-1]*D_[t-1]))*NR2B V_[t]=V_[t-1]+dt* (AB_[t] - v_off*V_[t-1])*NR2B W_[t]=W_[t-1]+dt* (1/(1+exp((1-P_[t-1])/p_steep)) - 1/(1+exp((1-D_[t-1])/d_steep)) - w_off*W_[t-1]) endfor // Show results if they are not already displayed. if(!strlen(WinList("Results",";",""))) Display /K=1 /N=Results W_ DoWindow /T Results,"Results" Label left "Plasticity Readout" Label bottom "Time (s)" ModifyGraph prescaleExp(bottom)=-3 endif End // Function to generate the simulation controller panel. Function GerkinController() NewPanel /K=1 /N=$"Simulation_Controller" /W=(100,100,320,600) GerkinInitialize("") Variable i SetDataFolder root:Parameters String vars=VariableList("*",";",4) // All the variables in the current folder. SetDataFolder root: String var_name // Loop to add all the variables listed in 'vars' to the controller panel. for(i=0;i<ItemsInList(vars);i+=1) var_name=StringFromList(i,vars) NVar var=root:Parameters:$var_name SetVariable $var_name size={100,25},variable=var endfor Button Go,proc=GerkinSimulate,title="Go" Button Reset,proc=GerkinInitialize,title="Reset" End // Initialize all the parameters. Function GerkinInitialize(ctrlName) String ctrlName NewDataFolder /O/S root:Parameters Variable /G duration=5000 // in milliseconds. Variable /G frequency=1 // in Hz. Variable /G pulse_width=5 // in milliseconds. Variable /G ab_on=1 Variable /G ba_on=1 Variable /G timing=10 // ba - ab, in milliseconds. Variable /G dt=0.01 // Simulation time-scale, in milliseconds. Variable /G p_off=1/30 Variable /G d_off=1/30 Variable /G v_off=1 Variable /G lambda=1000 Variable /G p_steep=1/5 Variable /G d_steep=1/5 Variable /G w_off=1/3000 Variable /G nr2a=1 Variable /G nr2b=1 SetDataFolder root: End