#!/usr/bin/python -W ignore
__author__ = "Zafeirios Fountas"
__credits__ = ["Murray Shanahan", "Mark Humphries", "Rob Leech", "Jeanette Hellgren Kotaleski"]
__license__ = "GPLv3"
__version__ = "0.1"
__maintainer__ = "Zafeirios Fountas"
__email__ = "fountas@outlook.com"
__status__ = "Published"
from sys import argv, exit
from numpy import pi
from random import random
from bg_model.model import BasalGanglia
# -----------------------------------------------------------------------------
def print_usage() :
print "Usage: python experiment1.py -fr <freq> -dop <dop> -ph <phase> "+\
"-file <optional: data_file_name> -print <optional: True/False>"
if len(argv) < 2:
print "---------------------------------------------- "
print " Warning: Running without arguments. "
print " To see list of basic arguments, run: "
print " bgrun --help "
print " "
FREQ1 = -1.0 # It takes the value -1 if it is the same as freq2
FREQ2 = 20.0
DOP = 0.3 # Could be random()*1.0
PHASE = random()*2.0
DATA_FILE = ""
PRINT = False
PLASTICITY = True
DURATION = 1500 # ms
REC_GPe_types = False
REC_RASTERS = False
REC_BINS = False
# It will run for 500ms in tonic mode so it will be ready for transient recordings..
INITIAL_PERIOD = False
# Random input that simulates behaviour
RANDOM_WALK = False
# Tonic mode
TONIC = False
# Oscillation only in one channel
ONE_CHANNEL = False
T1max = 7.5
T2max = 10.0
T1base = 3.0
T2base = 0.0
T3base = 3.0
PD_OFF_STATE = False
WEIGHT_Bahuguna = 1.5 # Ratio of SD2 to SD1 connections compared to SD1 to SD2.
PLOTS = False
PLOT_GPe = False
SEED = 1000
RAMP = -1 # The duration of a fade-in effect of the input. -1 for deactivation..
END = -1 # It's more like duration of the input stimulus
# If > 0, they represent difference between the default G_x_y and the current
GG_stn_gpe = -1
GG_gpe_stn = -1
GPe_density = [-1,-1,-1]
GPe_type = -1
P_STRIATUM_WEIGHT = 1.0 # how many times this prob is increased
# Parse arguments
i = 1
while i < len(argv) :
if argv[i] == "--help" :
print_usage()
exit()
if argv[i] == "-seed" :
i+=1
if argv[i] == "rand" or argv[i] == "random" :
SEED = int(random()*10000)
else :
SEED = int(argv[i])
elif argv[i] == "-duration" :
i+=1
DURATION = float(argv[i])
elif argv[i] == "-fr" :
i+=1
FREQ2 = float(argv[i])
elif argv[i] == "-fr1" :
i+=1
FREQ1 = float(argv[i])
elif argv[i] == "-dop" :
i+=1
DOP = float(argv[i])
elif argv[i] == "-end" :
i+=1
END = float(argv[i])
elif argv[i] == "-ph" :
i+=1
PHASE = float(argv[i])
elif argv[i] == "-plots" :
PLOTS = True
elif argv[i] == "-plot_gpe" :
PLOT_GPe = True
elif argv[i] == "-file" :
i+=1
DATA_FILE = argv[i]
elif argv[i] == "-print" :
PRINT = True
# -- INPUT TYPES ------------------
elif argv[i] == "-initial_period" :
INITIAL_PERIOD = True
elif argv[i] == "-random_walk" :
RANDOM_WALK = True
# -- RECORDING OPTIONS ------------
elif argv[i] == "-rec_GPe_types" :
REC_GPe_types = True
elif argv[i] == "-rec_rasters" :
REC_RASTERS = True
#PLOTS = True
elif argv[i] == "-rec_bins" :
REC_BINS = True
# -- INPUT MODES ------------------
elif argv[i] == "-tonic" :
TONIC = True
elif argv[i] == "-one_channel" :
ONE_CHANNEL = True
# -----
elif argv[i] == "-ramp" :
i+=1
RAMP = float(argv[i])
elif argv[i] == "-GG_stn_gpe" :
i+=1
GG_stn_gpe = float(argv[i])
elif argv[i] == "-GG_gpe_stn" :
i+=1
GG_gpe_stn = float(argv[i])
# -- AMPLITUTE OF INPUTS ----------
elif argv[i] == "-T1base" :
i+=1
T1base = float(argv[i])
elif argv[i] == "-T2base" :
i+=1
T2base = float(argv[i])
elif argv[i] == "-T3base" :
i+=1
T3base = float(argv[i])
elif argv[i] == "-T1max" :
i+=1
T1max = float(argv[i])
elif argv[i] == "-T2max" :
i+=1
T2max = float(argv[i])
# -----
elif argv[i] == "-pd_off_state" :
i+=1
PD_OFF_STATE = True
elif argv[i] == "-weight_Bahuguna" :
i+=1
WEIGHT_Bahuguna = float(argv[i])
elif argv[i] == "-P_striatum_weight" :
i+=1
P_STRIATUM_WEIGHT = float(argv[i])
elif argv[i] == "-GPe_density" :
i+=1
GPe_density[0] = float(argv[i])
i+=1
GPe_density[1] = float(argv[i])
GPe_density[2] = 1.0 - GPe_density[0] - GPe_density[1]
elif argv[i] == "-gpe_type" : # Allows only one GPe neuron type
i+=1
if argv[i] == "A" :
GPe_type = 0
elif argv[i] == "B" :
GPe_type = 1
elif argv[i] == "C" :
GPe_type = 2
elif argv[i] == "-plasticity" :
i+=1
if argv[i] == "True" :
PLASTICITY = True
elif argv[i] == "False" :
PLASTICITY = False
else :
print "Error: Unknown option for plasticity (True/False)", argv[i]
print_usage()
exit()
else :
print "Error: Unknown command", argv[i]
print_usage()
exit()
i+=1
# -----------------------------------------------------------------------------
bg = BasalGanglia(PRINT=PRINT, PLOTS=PLOTS, SEED=SEED)
if REC_RASTERS : bg.RECORD_RASTERS = True
if REC_BINS : bg.RECORD_BINS = True
if REC_GPe_types : bg.RECORD_GPe_types = True
bg.GPe_type = GPe_type
if PD_OFF_STATE == False :
bg.pars.DOPAMINE = DOP
else :
bg.pars.DOPAMINE = 0.0
if FREQ1 == -1.0 :
bg.pars.iFreq_LOW_T1 = FREQ2 # The same as FreqT2
else :
bg.pars.iFreq_LOW_T1 = FREQ1
bg.pars.iFreq_LOW_T2 = FREQ2
bg.pars.iPhase_LOW = PHASE * pi
bg.Plasticity = PLASTICITY
# How many times I increase/decrease the probability of recurrent connections
# in the striatum
if P_STRIATUM_WEIGHT != 1.0 :
bg.pars.P_MSN_MSN_in = min(bg.pars.P_MSN_MSN_in*P_STRIATUM_WEIGHT, 1.0)
bg.pars.P_MSN_MSN_ex = min(bg.pars.P_MSN_MSN_ex*P_STRIATUM_WEIGHT, 1.0)
# NOTE: Also change of FSI connections
bg.pars.P_FSI_MSN_in = min(bg.pars.P_FSI_MSN_in*P_STRIATUM_WEIGHT, 1.0)
bg.pars.P_FSI_MSN_ex = min(bg.pars.P_FSI_MSN_ex*P_STRIATUM_WEIGHT, 1.0)
bg.pars.P_FSI_FSI_in = min(bg.pars.P_FSI_FSI_in*P_STRIATUM_WEIGHT, 1.0)
bg.pars.P_FSI_FSI_ex = min(bg.pars.P_FSI_FSI_ex*P_STRIATUM_WEIGHT, 1.0)
# NOTE: Change that to show every argument!
string = "Starting experiment1 for freq "+str(FREQ2)+", dop "+str(DOP)+\
", phase "+str(PHASE)
if PLASTICITY :
string += ", plasticity"
if PLOTS :
string += ", plots"
if SEED != 1000 :
string += ", seed: " + str(SEED)
if DATA_FILE != "" :
string += ", filename " + DATA_FILE
else :
string += ", without saving"
# -- EXPERIMENT PARAMETERS -----------------------------------------------------
from brian import Hz, ms
if GG_stn_gpe >= 0 :
g0ampa = bg.pars.syn["GPe"]["G"]["STN-GPe"]["AMPA"]["value"]
g0nmda = bg.pars.syn["GPe"]["G"]["STN-GPe"]["NMDA"]["value"]
bg.pars.syn["GPe"]["G"]["STN-GPe"]["AMPA"]["value"] = g0ampa / float(GG_stn_gpe)
bg.pars.syn["GPe"]["G"]["STN-GPe"]["NMDA"]["value"] = g0nmda / float(GG_stn_gpe)
if GG_gpe_stn >= 0 :
g0 = bg.pars.syn["STN"]["G"]["GABA"]["value"]
bg.pars.syn["STN"]["G"]["GABA"]["value"] = g0 / float(GG_gpe_stn)
bg.RAMP = RAMP
string += ", ramp" + str(RAMP)
if END > 0 :
bg.END = END * ms
string += ", end" + str(END)
# -- STIMULATION ---------------------------------------------------------------
if TONIC : # ZERO CHANNELS ACTIVE - Tonic mode
bg.pars.T1_amp = 0.0 * Hz
bg.pars.T2_amp = 0.0 * Hz
bg.pars.base_input_T1 = 3.0*Hz
bg.pars.base_input_T2 = 3.0*Hz
bg.pars.base_input_T3 = 3.0*Hz
string += ", with tonic input"
elif ONE_CHANNEL : # ONE CHANNEL ACTIVE (rest tonic)
bg.pars.T1_amp = 0.0 * Hz
bg.pars.T2_amp = (T2max - T2base) * Hz
bg.pars.base_input_T1 = T1base*Hz
bg.pars.base_input_T2 = T2base*Hz
bg.pars.base_input_T3 = T3base*Hz
string += ", with one active channel at "+str(T2max)+"Hz and the "
string += "neighbouring channels at "+str(T1base)+"Hz and "+str(T3base)+"Hz"
else : # TWO CHANNELS ACTIVE
bg.pars.T1_amp = (T1max - T1base) * Hz
bg.pars.T2_amp = (T2max - T2base) * Hz
bg.pars.base_input_T1 = T1base*Hz
bg.pars.base_input_T2 = T2base*Hz
bg.pars.base_input_T3 = T3base*Hz
string += ", with competing input at "+str(T1max)+"Hz and "+ str(T2max)+"Hz"
# ------------------------------------------------------------------------------
if GPe_density != [-1,-1,-1] :
bg.pars.neur["GPe-typeA"]["density"]["value"] = GPe_density[0]
bg.pars.neur["GPe-typeB"]["density"]["value"] = GPe_density[1]
bg.pars.neur["GPe-typeC"]["density"]["value"] = GPe_density[2]
string += ", with GPe_density" + str(GPe_density)
if WEIGHT_Bahuguna != 1.5 :
print "weight_Bahuguna changed."
bg.weight_Bahuguna = WEIGHT_Bahuguna
# ---------------- INITIALIZATION AND RUN ------------------------------------ #
str_end = " for "+str(DURATION/1000.0)+" seconds!"
if PD_OFF_STATE :
str_end = " in PD 'off' state" + str_end
bg.PD_OFF_WEIGHT = 1.1
if INITIAL_PERIOD :
print string + " with 'initial tonic period' " + str_end
bg.initialize(EXPERIMENT = "initial_period")
elif RANDOM_WALK :
print string + " randomly " + str_end
bg.initialize(EXPERIMENT = "random_walk")
else :
print string + str_end
bg.initialize(EXPERIMENT = "none")
data1 = bg.run_experiment(DURATION=DURATION)
# ---------------------------------------------------------------------------- #
# #
# RECORDING DATA #
# #
# ---------------------------------------------------------------------------- #
if GG_stn_gpe >= 0 or GG_gpe_stn >= 0 :
data1["STATS"]["GG_stn_gpe"] = GG_stn_gpe
data1["STATS"]["GG_gpe_stn"] = GG_gpe_stn
if GPe_density != [-1,-1,-1] :
data1["STATS"]["GPe_density"] = GPe_density
#data1["STATS"]["T1_base"] = bg.pars.base_input_T1
#data1["STATS"]["T2_base"] = bg.pars.base_input_T2
#data1["STATS"]["T3_base"] = bg.pars.base_input_T3
#data1["STATS"]["T1_amp"] = bg.pars.T1_amp
#data1["STATS"]["T2_amp"] = bg.pars.T2_amp
#data1["STATS"]["base"] = [bg.pars.base_input_T1, bg.pars.base_input_T2, bg.pars.base_input_T3]
data1["STATS"]["plasticity"] = PLASTICITY
data1["STATS"]["seed"] = SEED
if END > 0 :
data1["STATS"]["stim_dur"] = END
data1["STATS"]["P_STRIATUM_WEIGHT"] = P_STRIATUM_WEIGHT
if INITIAL_PERIOD : data1["STATS"]["initial_period"] = True
else : data1["STATS"]["initial_period"] = False
if DATA_FILE != "" :
bg.save_data(DATA_FILE)
else :
print "Data not saved:", data1
bg.print_results()
if PLOTS :
#print data1
bg.print_results()
#bg.plot_SNr()
bg.SAVEPLOTS = True
bg.FOLDER = 'figures'
bg.plot_results()
if PLOT_GPe : bg.plot_GPe()
if PLOT_GPe : bg.plot_GPe_results()
if PLOT_GPe : bg.print_GPe_results()