"""
init.py
Starting script to run NetPyNE-based M1 model.
Usage:
python init.py # Run simulation, optionally plot a raster
MPI usage:
mpiexec -n 4 nrniv -python -mpi init.py
Contributors: salvadordura@gmail.com
"""
import matplotlib; matplotlib.use('Agg') # to avoid graphics error in servers
from netpyne import sim
#------------------------------------------------------------------------------
## Function to modify cell params during sim (e.g. modify PT ih)
def modifyMechsFunc(simTime):
from netpyne import sim
t = simTime
cellType = cfg.modifyMechs['cellType']
mech = cfg.modifyMechs['mech']
prop = cfg.modifyMechs['property']
newFactor = cfg.modifyMechs['newFactor']
origFactor = cfg.modifyMechs['origFactor']
factor = newFactor / origFactor
change = False
if cfg.modifyMechs['endTime']-1.0 <= t <= cfg.modifyMechs['endTime']+1.0:
factor = origFactor / newFactor if abs(newFactor) > 0.0 else origFactor
change = True
elif t >= cfg.modifyMechs['startTime']-1.0 <= t <= cfg.modifyMechs['startTime']+1.0:
factor = newFactor / origFactor if abs(origFactor) > 0.0 else newFactor
change = True
if change:
print(' Modifying %s %s %s by a factor of %f' % (cellType, mech, prop, factor))
for cell in sim.net.cells:
if 'cellType' in cell.tags and cell.tags['cellType'] == cellType:
for secName, sec in cell.secs.items():
if mech in sec['mechs'] and prop in sec['mechs'][mech]:
# modify python
sec['mechs'][mech][prop] = [g * factor for g in sec['mechs'][mech][prop]] if isinstance(sec['mechs'][mech][prop], list) else sec['mechs'][mech][prop] * factor
# modify neuron
for iseg, seg in enumerate(sec['hObj']): # set mech params for each segment
if sim.cfg.verbose: print(' Modifying %s %s %s by a factor of %f' % (secName, mech, prop, factor))
setattr(getattr(seg, mech), prop, getattr(getattr(seg, mech), prop) * factor)
# -----------------------------------------------------------
# Main code
cfg, netParams = sim.readCmdLineArgs()
sim.initialize(
simConfig = cfg,
netParams = netParams) # create network object and set cfg and net params
sim.pc.timeout(300) # set nrn_timeout threshold to X sec (max time allowed without increasing simulation time, t; 0 = turn off)
sim.net.createPops() # instantiate network populations
sim.net.createCells() # instantiate network cells based on defined populations
sim.net.connectCells() # create connections between cells based on params
sim.net.addStims() # add network stimulation
sim.setupRecording() # setup variables to record for each cell (spikes, V traces, etc)
# Simulation option 1: standard
# sim.runSim() # run parallel Neuron simulation (calling func to modify mechs)
print(cfg.modifyMechs)
# Simulation option 2: interval function to modify mechanism params
sim.runSimWithIntervalFunc(1000.0, modifyMechsFunc) # run parallel Neuron simulation (calling func to modify mechs)
# Gather/save data option 1: standard
# sim.gatherData()
# Gather/save data option 2: distributed saving across nodes
sim.saveDataInNodes()
sim.gatherDataFromFiles()
sim.saveData() # save params, cell info and sim output to file (pickle,mat,txt,etc)#
sim.analysis.plotData() # plot spike raster etc