"""
Get the extracellular fields over the axons given a certain stimulation
protocol
"""import os
import csv
from neuron import h, gui
from collections import OrderedDict
import workspace as ws
import simcontrol
import analysis as als
import biophysics as bio
# Prepare the necessary variables from the configuration files
simcontrol.prepare_workspace()
# Change the number of time steps and refresh the settings for the # simulation control
ws.settings['simulation control']['nt'] = 1# Manually modify some options in ws.settings so that this uses the # Resistor Network model and the electrodes defined in electrodes.json
ws.settings["nerve model"] = "resistor network"
ws.settings["ephaptic coupling"]["presence"] = "True"
ws.settings["stimulation"] = \
{
"method": "from electrodes",
"file": "None"
}
# Pulses dictionary and counter
pulses = {}
j = 0# Iterate over stimulating electrodesfor k, el in ws.electrodes_settings.items():
if el["role"] == "stimulation":
# print(k)# Iterate over active padsfor pad, protocol in el["stimulation protocol"].items():
# print("\t", pad, protocol["type"])# Iterate over pulses on this padif protocol["type"] == "square pulses":
for i, (o, d) inenumerate(zip(
protocol["pulse onset times"],
protocol["pulse durations"])):
# Add its properties to the dictionary
pulse = {}
pulse["electrode name"] = k
pulse["pad"] = pad
pulse["type"] = "square pulse"
pulse["delay"] = o
pulse["duration"] = d
pulse["pulse number for this pad"] = i
pulses[j] = pulse
# Update the pulse counter
j += 1# For each pulse, trick the model into thinking that # the pulse virtually won't happen# This is necessary to isolate all the pulses from # each other
ws.electrodes_settings[k]["stimulation protocol"] \
[pad]["pulse onset times"][i] = 2. * ws.tstop
# Save the original tstop
tstop_original = ws.tstop
# File to save the data in
espath = os.path.join(ws.folders['data/load'], 'extstim.csv')
# Now iterate over pulses and compute the field over # the axons for each pulsefor i, (k, p) inenumerate(pulses.items()):
# print(k, p)# Empty the current injections list and reset the counters
simcontrol.miscellanea()
# Turn the delay for this pulse to zero so the stimulation # starts inmediately
ws.electrodes_settings[p["electrode name"]]["stimulation protocol"] \
[p["pad"]]["pulse onset times"] \
[p["pulse number for this pad"]] = 0.# Prepare the necessary stuff for the simulation
simcontrol.prepare_simulation(prep_workspace=False)
simcontrol.setup_simcontrol()
# Run the simulation
simcontrol.run()
# Save the values into the file# If this is the first pulse, open the file as a new one
mode = "a"if k == 0:
mode = "w"withopen(espath, mode) as f:
# Write the number and type of pulse
fw = csv.writer(f)
fw.writerow(["Pulse", i])
fw.writerow(["Type", p["type"]])
fw.writerow(["Delay", p["delay"]])
fw.writerow(["Duration", p["duration"]])
# Get the fields for each axon
nvt = ws.nvt
for i, j inenumerate(range(nvt.nNAELC, nvt.nc, 1)):
exst = [seg.vext[ws.axonmodel_settings[nvt.models[j]]['extlayers']-1] \
for seg in ws.segments[j]]
fw.writerow([i] + exst)
# Once, finished, turn the delay for this pulse back to later than # tstop so it doesn't interfere with the following pulses
ws.electrodes_settings[p["electrode name"]]["stimulation protocol"] \
[p["pad"]]["pulse onset times"] \
[p["pulse number for this pad"]] = 2. * tstop_original