def fix_axon_perisomatic_directed(hobj): # io.log_info('Fixing Axon like perisomatic') all_sec_names = [] for sec in hobj.all: all_sec_names.append(sec.name().split(".")[1][:4]) if 'axon' not in all_sec_names: io.log_exception('There is no axonal recostruction in swc file.') else: beg1, end1, beg2, end2 = get_axon_direction(hobj) for sec in hobj.axon: h.delete_section(sec=sec) h.execute('create axon[2]', hobj) h.pt3dadd(beg1[0], beg1[1], beg1[2], 1, sec=hobj.axon[0]) h.pt3dadd(end1[0], end1[1], end1[2], 1, sec=hobj.axon[0]) hobj.all.append(sec=hobj.axon[0]) h.pt3dadd(beg2[0], beg2[1], beg2[2], 1, sec=hobj.axon[1]) h.pt3dadd(end2[0], end2[1], end2[2], 1, sec=hobj.axon[1]) hobj.all.append(sec=hobj.axon[1]) hobj.axon[0].connect(hobj.soma[0], 0.5, 0) hobj.axon[1].connect(hobj.axon[0], 1.0, 0) hobj.axon[0].L = 30.0 hobj.axon[1].L = 30.0 h.define_shape() for sec in hobj.axon: # print "sec.L:", sec.L if np.abs(30 - sec.L) > 0.0001: io.log_exception('Axon stub L is less than 30')
def __init__(self, network_dir, single_file=False, **params): self._network_dir = network_dir self._virt_lookup = {} self._gid_lookup = {} self._sec_lookup = {} if not os.path.exists(network_dir): os.makedirs(network_dir) if N_HOSTS > 1: io.log_exception( 'save_synapses module is not current supported with mpi') self._syn_writer = ConnectionWriter(network_dir)
def set_transfer_resistance(self, gid, seg_coords): rho = 300.0 # ohm cm r05 = seg_coords['p05'] nseg = r05.shape[1] cell_map = np.zeros((self.elnsites, nseg)) for el in six.moves.range(self.elnsites): mesh_size = self.el_mesh_size[el] for k in range(mesh_size): rel = np.expand_dims(self.el_mesh[el][:, k], axis=1) rel_05 = rel - r05 r2 = np.einsum('ij,ij->j', rel_05, rel_05) r = np.sqrt(r2) if not all(i >= 10 for i in r): io.log_exception('External electrode is too close') cell_map[el, :] += 1. / r cell_map *= (rho / (4 * math.pi)) * 0.01 self.trans_X[gid] = cell_map
def set_stim(self, stim_prop, spike_train): """Gets the spike trains for each individual cell.""" spikes = spike_train.get_times(node_id=self.node_id) if spikes is None: spikes = [] if np.any(np.array(spikes) < 0.0): # NRN will fail if VecStim contains negative spike-time, throw an exception and log info for user io.log_exception( 'spike train {} contains negative number, unable to run virtual cell in NEURON' .format(spikes)) spikes = np.sort( spikes ) # sort the spikes for NEURON, will throw a segfault if not sorted self._train_vec = h.Vector(spikes) vecstim = h.VecStim() vecstim.play(self._train_vec) self._hobj = vecstim
def fix_axon_allactive_directed(hobj): all_sec_names = [] for sec in hobj.all: all_sec_names.append(sec.name().split(".")[1][:4]) if 'axon' not in all_sec_names: io.log_exception('There is no axonal recostruction in swc file.') else: beg1, end1, beg2, end2 = get_axon_direction(hobj) axon_diams = [hobj.axon[0].diam, hobj.axon[0].diam] for sec in hobj.all: section_name = sec.name().split(".")[1][:4] if section_name == 'axon': axon_diams[1] = sec.diam for sec in hobj.axon: h.delete_section(sec=sec) h.execute('create axon[2]', hobj) hobj.axon[0].connect(hobj.soma[0], 1.0, 0) hobj.axon[1].connect(hobj.axon[0], 1.0, 0) h.pt3dadd(beg1[0], beg1[1], beg1[2], axon_diams[0], sec=hobj.axon[0]) h.pt3dadd(end1[0], end1[1], end1[2], axon_diams[0], sec=hobj.axon[0]) hobj.all.append(sec=hobj.axon[0]) h.pt3dadd(beg2[0], beg2[1], beg2[2], axon_diams[1], sec=hobj.axon[1]) h.pt3dadd(end2[0], end2[1], end2[2], axon_diams[1], sec=hobj.axon[1]) hobj.all.append(sec=hobj.axon[1]) hobj.axon[0].L = 30.0 hobj.axon[1].L = 30.0 h.define_shape() for sec in hobj.axon: # io.log_info('sec.L: {}'.format(sec.L)) if np.abs(30 - sec.L) > 0.0001: io.log_exception('Axon stub L is less than 30')
def from_config(cls, config, network, set_recordings=True): # TODO: convert from json to sonata config if necessary sim = cls(network=network, dt=config.dt, tstop=config.tstop, v_init=config.v_init, celsius=config.celsius, cao0=config.cao0, optocell=config.optocell, nsteps_block=config.block_step) network.io.log_info('Building cells.') network.build_nodes() network.io.log_info('Building recurrent connections') network.build_recurrent_edges() # TODO: Need to create a gid selector for sim_input in inputs.from_config(config): node_set = network.get_node_set(sim_input.node_set) if sim_input.input_type == 'spikes': spikes = spike_trains.SpikesInput.load( name=sim_input.name, module=sim_input.module, input_type=sim_input.input_type, params=sim_input.params) io.log_info('Build virtual cell stimulations for {}'.format( sim_input.name)) network.add_spike_trains(spikes, node_set) elif sim_input.module == 'IClamp': # TODO: Parse from csv file amplitude = sim_input.params['amp'] delay = sim_input.params['delay'] duration = sim_input.params['duration'] gids = sim_input.params['node_set'] sim.attach_current_clamp(amplitude, delay, duration, node_set) elif sim_input.module == 'xstim': sim.add_mod(mods.XStimMod(**sim_input.params)) else: io.log_exception('Can not parse input format {}'.format( sim_input.name)) if config.calc_ecp: for gid, cell in network.cell_type_maps('biophysical').items(): cell.setup_ecp() sim.h.cvode.use_fast_imem(1) # Parse the "reports" section of the config and load an associated output module for each report sim_reports = reports.from_config(config) for report in sim_reports: if isinstance(report, reports.SpikesReport): mod = mods.SpikesMod(**report.params) elif isinstance(report, reports.SectionReport): mod = mods.SectionReport(**report.params) elif isinstance(report, reports.MembraneReport): if report.params['sections'] == 'soma': mod = mods.SomaReport(**report.params) else: mod = mods.MembraneReport(**report.params) elif isinstance(report, reports.ECPReport): assert config.calc_ecp mod = mods.EcpMod(**report.params) # Set up the ability for ecp on all relevant cells # TODO: According to spec we need to allow a different subset other than only biophysical cells # for gid, cell in network.cell_type_maps('biophysical').items(): # cell.setup_ecp() elif report.module == 'save_synapses': mod = mods.SaveSynapses(**report.params) else: # TODO: Allow users to register customized modules using pymodules io.log_warning('Unrecognized module {}, skipping.'.format( report.module)) continue sim.add_mod(mod) return sim
def from_config(cls, config, network, set_recordings=True): # TODO: convert from json to sonata config if necessary #The network must be built before initializing the simulator because #gap junctions must be set up before the simulation is initialized. network.io.log_info('Building cells.') network.build_nodes() network.io.log_info('Building recurrent connections') network.build_recurrent_edges() sim = cls(network=network, dt=config.dt, tstop=config.tstop, v_init=config.v_init, celsius=config.celsius, nsteps_block=config.block_step) # TODO: Need to create a gid selector for sim_input in inputs.from_config(config): try: network.get_node_set(sim_input.node_set) except: print( "Parameter node_set must be given in inputs module of simulation_config file. If unsure of what node_set should be, set it to 'all'." ) node_set = network.get_node_set(sim_input.node_set) if sim_input.input_type == 'spikes': io.log_info('Building virtual cell stimulations for {}'.format( sim_input.name)) path = sim_input.params['input_file'] spikes = SpikeTrains.load(path=path, file_type=sim_input.module, **sim_input.params) network.add_spike_trains(spikes, node_set) elif sim_input.module == "FileIClamp": sim.attach_file_current_clamp(sim_input.params["input_file"]) elif sim_input.module == 'IClamp': # TODO: Parse from csv file try: len(sim_input.params['amp']) except: sim_input.params['amp'] = [float(sim_input.params['amp'])] if len(sim_input.params['amp']) > 1: sim_input.params['amp'] = [ float(i) for i in sim_input.params['amp'] ] try: len(sim_input.params['delay']) except: sim_input.params['delay'] = [ float(sim_input.params['delay']) ] if len(sim_input.params['delay']) > 1: sim_input.params['delay'] = [ float(i) for i in sim_input.params['delay'] ] try: len(sim_input.params['duration']) except: sim_input.params['duration'] = [ float(sim_input.params['duration']) ] if len(sim_input.params['duration']) > 1: sim_input.params['duration'] = [ float(i) for i in sim_input.params['duration'] ] amplitude = sim_input.params['amp'] delay = sim_input.params['delay'] duration = sim_input.params['duration'] try: sim_input.params['gids'] except: sim_input.params['gids'] = None if sim_input.params['gids'] is not None: gids = sim_input.params['gids'] else: gids = list(node_set.gids()) sim.attach_current_clamp(amplitude, delay, duration, gids) elif sim_input.module == "SEClamp": try: len(sim_input.params['amps']) except: sim_input.params['amps'] = [ float(sim_input.params['amps']) ] try: len(sim_input.params['durations']) except: sim_input.params['durations'] = [ float(sim_input.params['durations']) ] amplitudes = sim_input.params['amps'] durations = sim_input.params['durations'] rs = None if "rs" in sim_input.params.keys(): try: len(sim_input.params['rs']) except: sim_input.params['rs'] = [ float(sim_input.params['rs']) ] if len(sim_input.params['rs']) > 1: sim_input.params['rs'] = [ float(i) for i in sim_input.params['rs'] ] rs = sim_input.params["rs"] try: sim_input.params['gids'] except: sim_input.params['gids'] = None if sim_input.params['gids'] is not None: gids = sim_input.params['gids'] else: gids = list(node_set.gids()) sim.attach_se_voltage_clamp(amplitudes, durations, gids, rs) elif sim_input.module == 'xstim': sim.add_mod(mods.XStimMod(**sim_input.params)) else: io.log_exception('Can not parse input format {}'.format( sim_input.name)) # Parse the "reports" section of the config and load an associated output module for each report sim_reports = reports.from_config(config) for report in sim_reports: if isinstance(report, reports.SpikesReport): mod = mods.SpikesMod(**report.params) elif report.module == 'netcon_report': mod = mods.NetconReport(**report.params) elif isinstance(report, reports.MembraneReport): if report.params['sections'] == 'soma': mod = mods.SomaReport(**report.params) else: mod = mods.MembraneReport(**report.params) elif isinstance(report, reports.ClampReport): mod = mods.ClampReport(**report.params) elif isinstance(report, reports.ECPReport): mod = mods.EcpMod(**report.params) # Set up the ability for ecp on all relevant cells # TODO: According to spec we need to allow a different subset other than only biophysical cells for gid, cell in network.cell_type_maps('biophysical').items(): cell.setup_ecp() elif report.module == 'save_synapses': mod = mods.SaveSynapses(**report.params) else: # TODO: Allow users to register customized modules using pymodules io.log_warning('Unrecognized module {}, skipping.'.format( report.module)) continue sim.add_mod(mod) return sim
def from_config(cls, config, network, set_recordings=True): simulation_inputs = inputs.from_config(config) # Special case for setting synapses to spontaneously (for a given set of pre-synaptic cell-types). Using this # input will change the way the network builds cells/connections and thus needs to be set first. for sim_input in simulation_inputs: if sim_input.input_type == 'syn_activity': network.set_spont_syn_activity( precell_filter=sim_input.params['precell_filter'], timestamps=sim_input.params['timestamps'] ) # The network must be built before initializing the simulator because # gap junctions must be set up before the simulation is initialized. network.io.log_info('Building cells.') network.build_nodes() network.io.log_info('Building recurrent connections') network.build_recurrent_edges() sim = cls(network=network, dt=config.dt, tstop=config.tstop, v_init=config.v_init, celsius=config.celsius, nsteps_block=config.block_step) # TODO: Need to create a gid selector for sim_input in inputs.from_config(config): try: network.get_node_set(sim_input.node_set) except: print("Parameter node_set must be given in inputs module of simulation_config file. If unsure of what node_set should be, set it to 'all'.") node_set = network.get_node_set(sim_input.node_set) if sim_input.input_type == 'spikes': io.log_info('Building virtual cell stimulations for {}'.format(sim_input.name)) path = sim_input.params['input_file'] spikes = SpikeTrains.load(path=path, file_type=sim_input.module, **sim_input.params) network.add_spike_trains(spikes, node_set) elif sim_input.module == "FileIClamp": sim.attach_file_current_clamp(sim_input.params["input_file"]) elif sim_input.module == 'IClamp': # TODO: Parse from csv file try: len(sim_input.params['amp']) except: sim_input.params['amp']=[float(sim_input.params['amp'])] if len(sim_input.params['amp'])>1: sim_input.params['amp']=[float(i) for i in sim_input.params['amp']] try: len(sim_input.params['delay']) except: sim_input.params['delay']=[float(sim_input.params['delay'])] if len(sim_input.params['delay'])>1: sim_input.params['delay']=[float(i) for i in sim_input.params['delay']] try: len(sim_input.params['duration']) except: sim_input.params['duration']=[float(sim_input.params['duration'])] if len(sim_input.params['duration'])>1: sim_input.params['duration']=[float(i) for i in sim_input.params['duration']] amplitude = sim_input.params['amp'] delay = sim_input.params['delay'] duration = sim_input.params['duration'] # specificed for location to place iclamp hobj.<section_name>[<section_index>](<section_dist>). The # default is hobj.soma[0](0.5), the center of the soma section_name = sim_input.params.get('section_name', 'soma') section_index = sim_input.params.get('section_index', 0) section_dist = sim_input.params.get('section_dist', 0.5) # section_name = section_name if isinstance(section_name, (list, tuple)) else [section_name] # section_index = section_index if isinstance(section_index, (list, tuple)) else [section_index] # section_dist = section_dist if isinstance(section_dist, (list, tuple)) else [section_dist] try: sim_input.params['gids'] except: sim_input.params['gids'] = None if sim_input.params['gids'] is not None: gids = sim_input.params['gids'] else: gids = list(node_set.gids()) sim.attach_current_clamp(amplitude, delay, duration, gids, section_name, section_index, section_dist) elif sim_input.module == "SEClamp": try: len(sim_input.params['amps']) except: sim_input.params['amps']=[float(sim_input.params['amps'])] try: len(sim_input.params['durations']) except: sim_input.params['durations']=[float(sim_input.params['durations'])] amplitudes = sim_input.params['amps'] durations = sim_input.params['durations'] rs = None if "rs" in sim_input.params.keys(): try: len(sim_input.params['rs']) except: sim_input.params['rs']=[float(sim_input.params['rs'])] if len(sim_input.params['rs'])>1: sim_input.params['rs']=[float(i) for i in sim_input.params['rs']] rs = sim_input.params["rs"] try: sim_input.params['gids'] except: sim_input.params['gids'] = None if sim_input.params['gids'] is not None: gids = sim_input.params['gids'] else: gids = list(node_set.gids()) sim.attach_se_voltage_clamp(amplitudes, durations, gids, rs) elif sim_input.module == 'xstim': sim.add_mod(mods.XStimMod(**sim_input.params)) elif sim_input.module == 'syn_activity': pass else: io.log_exception('Can not parse input format {}'.format(sim_input.name)) # Parse the "reports" section of the config and load an associated output module for each report sim_reports = reports.from_config(config) for report in sim_reports: if isinstance(report, reports.SpikesReport): mod = mods.SpikesMod(**report.params) elif report.module == 'netcon_report': mod = mods.NetconReport(**report.params) elif isinstance(report, reports.MembraneReport): if report.params['sections'] == 'soma': mod = mods.SomaReport(**report.params) else: mod = mods.MembraneReport(**report.params) elif isinstance(report, reports.ClampReport): mod = mods.ClampReport(**report.params) elif isinstance(report, reports.ECPReport): mod = mods.EcpMod(**report.params) # Set up the ability for ecp on all relevant cells # TODO: According to spec we need to allow a different subset other than only biophysical cells for gid, cell in network.cell_type_maps('biophysical').items(): cell.setup_ecp() elif report.module == 'save_synapses': mod = mods.SaveSynapses(**report.params) else: # TODO: Allow users to register customized modules using pymodules io.log_warning('Unrecognized module {}, skipping.'.format(report.module)) continue sim.add_mod(mod) return sim