https://github.com/NikVard/memstim-hh
Tip revision: 563f808f6c4f40630f5b8876cc0b440cdf4159e8 authored by NikVard on 22 September 2023, 08:19:24 UTC
[UPDATE] Updated default figure names in scripts
[UPDATE] Updated default figure names in scripts
Tip revision: 563f808
parameters_multi.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# Memory Stimulation and Phase-Amplitude Coupling
# Copyright 2021 Nikolaos Vardlakis & Nicolas P. Rougier
# Released under the BSD 3-clauses license
# -----------------------------------------------------------------------------
import os
import json
import time
import subprocess
import numpy as np
from numpy import pi
# Constants
# noise_exc = 10. # uV
# noise_inh = 1. # uV
noise_exc = 0. # uV
noise_inh = 0. # uV
noise_EC = noise_DG = noise_CA3 = noise_CA1 = 0.
noise_EC_exc = noise_DG_exc = noise_CA3_exc = noise_CA1_exc = 0.0
noise_EC_inh = noise_DG_inh = noise_CA3_inh = noise_CA1_inh = 0.0
noise_EC_exc = 0. # 0.0031
noise_EC_inh = 0. # 0.0017
noise_DG_exc = 0. # 0.003
noise_DG_inh = 0. #
noise_CA3_exc = 0. # 0.003
noise_CA3_inh = 0. #
noise_CA1_exc = 0. # 0.0031
noise_CA1_inh = 0. #
# Default parameters
a = b = c = d = 0. # connections
a = 13. # 13
b = 0.14 # 0.14
c = 1.1 # 1.1
d = 0.2 # 0.2 // 0.43 new val
# a = 240. # 13
# b = 0.09 # 0.14
# c = 1.1 # 1.1
# d = 0.21 # 0.2 // 0.43 new val
I_in = 0.22 # 0.22 input gain Kuramoto
stim_amplitude = [7.] # nA
stim_onset = 1.8 # sec
# Default parameters
_data = {
"seed_val" : 42, # Reproducibility
# areas, tables 3.1-3.3, pages 45-48, Aussel
"areas": {
"EC" : {
"E" : {
"N" : int(10e3),
"type" : "PyCAN",
"noise" : noise_exc # Volts
},
"I" : {
"N" : int(1e3),
"type" : "Inh",
"noise" : noise_inh
}
},
"DG" : {
"E" : {
"N" : int(10e3),
"type" : "Py",
"noise" : noise_exc
},
"I" : {
"N" : int(0.1e3),
"type" : "Inh",
"noise" : noise_inh
}
},
"CA3" : {
"E" : {
"N" : int(1e3),
"type" : "PyCAN",
"noise" : noise_exc
},
"I" : {
"N" : int(0.1e3),
"type" : "Inh",
"noise" : noise_inh
}
},
"CA1" : {
"E" : {
"N" : int(10e3),
"type" : "PyCAN",
"noise" : noise_exc
},
"I" : {
"N" : int(1e3),
"type" : "Inh",
"noise" : noise_inh
}
}
},
# connectivity parameters
"connectivity" : {
"intra" : { # intra-area conn. probabilities per area |
"EC" : [[0., 0.37], [0.54, 0.]], # [[E-E, E-I], [I-E, I-I]]
"DG" : [[0., 0.06], [0.14, 0.]],
"CA3" : [[0.56, 0.75], [0.75, 0.]],
"CA1" : [[0., 0.28], [0.3, 0.7]]
},
"inter" : { # inter-area conn. probabilities
"p_tri" : 0.45, # tri: [DG->CA3, CA3->CA1, CA1->EC] Aussel, pages 49,59
"p_mono" : 0.2 # mono: [EC->CA3, EC->CA1]
},
"inter_custom" : {
"EC" : {
"E" : [[0., 0.], [a, a], [b, b], [c, c]],
"I" : [[0., 0.], [0., 0.], [0., 0.], [0., 0.]]
},
"DG" : {
"E" : [[0., 0.], [0., 0.], [b, b], [0., 0.]],
"I" : [[0., 0.], [0., 0.], [0., 0.], [0., 0.]]
},
"CA3" : {
"E" : [[0., 0.], [0., 0.], [0., 0.], [c, c]],
"I" : [[0., 0.], [0., 0.], [0., 0.], [0., 0.]]
},
"CA1" : {
"E" : [[d, d], [0., 0.], [0., 0.], [0., 0.]],
"I" : [[0., 0.], [0., 0.], [0., 0.], [0., 0.]]
}
}
},
# synapses
# "synapses" : {
# "gmax_e" : 600., # pSiemens
# "gmax_i" : 60.
# },
# input parameters
"fixed_input" : {
"enabled" : 0, # [1=yes | 0=no]
"low" : 0.0, # A0
"high" : 0.0, # A1
"frequency" : 6.0, # Hz
"delay" : 0.0, # seconds
},
# Kuramoto oscillator parameters
"Kuramoto" : {
"N" : 250,
"f0" : 6.,
"sigma" : 0.5, # normal std
"kN" : 15,
"gain_reset" : 4.0, # maybe 2?
"gain_rhythm" : np.around(I_in, 2), # nA
"offset" : -0*pi/2
},
# stimulation parameters
"stimulation" : {
"target" : "CA1", # target area [EC | DG | CA3 | CA1]
"coordinates" : (5.0, -8., 7.5), # point electrode coordinates (x,y,z) [mm]
"sigma" : 0.33, # conductivity of homogeneous conductive medium [S/m]
"duration" : 5., # [sec]
"dt" : .1e-3, # [sec]
"onset" : stim_onset, # [sec]
"I" : stim_amplitude, # stimulation amplitude [nA]
"pulse_width" : [1.e-3], # width (in time) of pulse ON phase [sec]
"stim_freq" : 5, # stimulation frequency [Hz]
"pulse_freq" : 100, # pulse frequency, determines ON duration [Hz]
"nr_of_trains" : 1, # number of pulse trains
"nr_of_pulses" : 1, # number of pulses per train
"ipi" : .1e-3 # inter-pulse interval [sec]
},
# simulation parameters
"simulation" : {
"duration" : 10.0, # second
"dt" : .1e-3, # second
"debugging" : False
},
# git stuff
"timestamp" : None,
"git_branch" : None,
"git_hash" : None,
"git_short_hash" : None
}
def is_git_repo():
""" Return whether current directory is a git directory """
if subprocess.call(["git", "branch"],
stderr=subprocess.STDOUT, stdout=open(os.devnull, 'w')) != 0:
return False
return True
def get_git_revision_hash():
""" Get current git hash """
if is_git_repo():
answer = subprocess.check_output(
['git', 'rev-parse', 'HEAD'])
return answer.decode("utf8").strip("\n")
return "None"
def get_git_revision_short_hash():
""" Get current git short hash """
if is_git_repo():
answer = subprocess.check_output(
['git', 'rev-parse', '--short', 'HEAD'])
return answer.decode("utf8").strip("\n")
return "None"
def get_git_revision_branch():
""" Get current git branch """
if is_git_repo():
answer = subprocess.check_output(
['git', 'rev-parse', '--abbrev-ref', 'HEAD'])
return answer.decode("utf8").strip("\n")
return "None"
def default():
""" Get default parameters """
_data["timestamp"] = time.ctime()
_data["git_branch"] = get_git_revision_branch()
_data["git_hash"] = get_git_revision_hash()
_data["git_short_hash"] = get_git_revision_short_hash()
return _data
def save(filename, data=None):
""" Save parameters into a json file """
if data is None:
data = { name : eval(name) for name in _data.keys()
if name not in ["timestamp", "git_branch", "git_hash"] }
data["timestamp"] = time.ctime()
data["git_branch"] = get_git_revision_branch()
data["git_hash"] = get_git_revision_hash()
data["git_short_hash"] = get_git_revision_short_hash()
with open(filename, "w") as outfile:
json.dump(data, outfile, indent=4, sort_keys=False)
def load(filename):
""" Load parameters from a json file """
with open(filename) as infile:
data = json.load(infile)
return data
def dump(data):
if not _data["timestamp"]:
_data["timestamp"] = time.ctime()
if not _data["git_branch"]:
_data["git_branch"] = get_git_revision_branch()
if not _data["git_hash"]:
_data["git_hash"] = get_git_revision_hash()
_data["git_short_hash"] = get_git_revision_short_hash()
for key, value in data.items():
print(f"{key:15s} : {value}")
# -----------------------------------------------------------------------------
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description='Generate parameters file using JSON format')
parser.add_argument('-f', '--filename',
default='default',
type=str, nargs='?',
help='Parameters file (json format)')
parser.add_argument('-po', '--parameters_old',
action='store_true',
default=False,
help='Set this to generate default parameters file instead.')
parser.add_argument('-o', '--output-directory',
nargs='?',
type=str,
default='configs',
help='Output directory')
args = parser.parse_args()
# Delete custom connectivity
if args.parameters_old:
del _data["connectivity"]["inter_custom"]
# Make directories
basedir = args.output_directory
if not os.path.isdir(basedir):
print('[+] Creating directory', basedir)
os.makedirs(basedir)
# dir_EC = os.path.join(basedir, 'opt_noise_EC')
# dir_DG = os.path.join(basedir, 'opt_noise_DG')
# dir_CA3 = os.path.join(basedir, 'opt_noise_CA3')
# dir_CA1 = os.path.join(basedir, 'opt_noise_CA1')
vmin,vmax = 30,45
noise_vals = np.arange(vmin, vmax)
areas = ['EC', 'DG', 'CA3', 'CA1']
# for area in areas:
# currdir = os.path.join(basedir, 'opt_noise_'+area)
# if not os.path.isdir(currdir):
# print('[+] Creating directory', currdir)
# os.makedirs(currdir)
#
# # Fix the parameters
# cnt=0
# for val in noise_vals:
# _data["areas"][area]["E"]["noise"] = np.around(val*100.e-06, 6)
# _data["areas"][area]["I"]["noise"] = np.around(val*10.e-06, 6)
#
# # Define the filename
# # filename = "./{0}/{1}_{2:02d}.json".format(args.output_directory, args.filename, cnt)
# filename = os.path.join(currdir, (args.filename+'{0:02d}.json').format(cnt))
# print('Saving file "{0}"'.format(filename))
# save(filename, _data)
# cnt += 1
#
# _data["areas"][area]["E"]["noise"] = 0.
# _data["areas"][area]["I"]["noise"] = 0.
vmin,vmax,vstep = 0., 55., 5.
vals = np.arange(vmin, vmax, vstep)
# vals = np.linspace(vmin, vmax, 17)
# stim_times = [5.6050, 5.6153,5.6257, 5.6360, 5.6464, 5.6567, 5.6671, 5.6775, 5.6879, 5.7557, 5.7734, 5.7856, 5.7966, 5.8072, 5.8176, 5.8280, 5.8383]
# stim_times = np.loadtxt('stim_times.txt')
# stim_amplitude = 20.
cnt = 0
stim_t_off = 1.5
for val in vals:
_data["Kuramoto"]["kN"] = np.around(val, 2)
# _data["fixed_input"]["high"] = np.around(val,2)
# _data["connectivity"]["inter_custom"]["EC"]["E"][2] = [np.around(val, 2)]*2
# _data["connectivity"]["inter_custom"]["DG"]["E"][2] = [np.around(val, 2)]*2
# _data["connectivity"]["inter_custom"]["EC"]["E"][3] = [np.around(val, 2)]*2
# _data["connectivity"]["inter_custom"]["CA3"]["E"][3] = [np.around(val, 2)]*2
# _data["connectivity"]["inter_custom"]["CA1"]["E"][0] = [np.around(val, 2)]*2
# _data["areas"]["EC"]["E"]["noise"] = np.around(val, 6)
# _data["areas"]["EC"]["I"]["noise"] = np.around(val, 6)
# _data["areas"]["DG"]["E"]["noise"] = np.around(val, 6)
# _data["areas"]["DG"]["I"]["noise"] = np.around(val, 6)
# _data["areas"]["CA3"]["E"]["noise"] = np.around(val, 6)
# _data["areas"]["CA3"]["I"]["noise"] = np.around(val, 6)
# _data["areas"]["CA1"]["E"]["noise"] = np.around(val, 6)
# _data["areas"]["CA1"]["I"]["noise"] = np.around(val, 6)
# _data["stimulation"]["onset"] = np.round(stim_t_off+val,3)
# _data["stimulation"]["I"] = [np.round(val,1)]
# _data["stimulation"]["stim_freq"] = np.around(val, 1).astype(int).item()
# _data["stimulation"]["nr_of_trains"] = np.rint(5*val).astype(int).item()
# Used for PRC calc
# _data["stimulation"]["I"] = [np.round(stim_amplitude,1)]
# _data["stimulation"]["onset"] = np.round(val,4)
# Define the filename
filename = os.path.join(basedir, (args.filename+'{0:02d}.json').format(cnt))
print('Saving file "{0}"'.format(filename))
save(filename, _data)
cnt += 1
# _data["connectivity"]["inter_custom"]["EC"]["E"][1] = np.around([a, a], decimals=1).tolist()
# _data["connectivity"]["inter_custom"]["EC"]["E"][2] = np.around([b, b], decimals=1).tolist()
# _data["connectivity"]["inter_custom"]["EC"]["E"][3] = np.around([c, c], decimals=1).tolist()
# _data["connectivity"]["inter_custom"]["DG"]["E"][2] = np.around([b, b], decimals=1).tolist()
# _data["connectivity"]["inter_custom"]["CA3"]["E"][3] = np.around([c, c], decimals=1).tolist()
# _data["connectivity"]["inter_custom"]["CA1"]["E"][0] = np.around([d, d], decimals=1).tolist()
