__author__ = 'Aaron D. Milstein' from specify_cells import * import random import os from ipyparallel import interactive """ Builds a cell locally so each engine is ready to receive jobs one at a time, specified by a list of indexes corresponding to which synapses to stimulate. """ morph_filename = 'EB2-late-bifurcation.swc' mech_filename = '043016 Type A - km2_NMDA_KIN5_Pr' rec_filename = 'output'+datetime.datetime.today().strftime('%m%d%Y%H%M')+'-pid'+str(os.getpid()) #NMDA_type = 'NMDA_KIN2' NMDA_type = 'NMDA_KIN3' gmax = 0.00313 # 0.0003 # placeholder for optimization parameter, must be pushed to each engine on each iteration gamma = 0.062 Kd = 3.57 kin_scale = 3. interp_dt = 0.01 @interactive def stim_actual(spine_indexes): """ Called by controller, mapped to each engine. Sequentially activates spines specified by a list of indexes and saves the resulting output to a file. :param spine_indexes: list of int :return: str """ sim.parameters['syn_indexes'] = [] for i, index in enumerate(spine_indexes): spine = spine_list[index] syn = spine.synapses[0] syn.target(NMDA_type).gmax = gmax syn.target(NMDA_type).gamma = gamma syn.target(NMDA_type).Kd = Kd syn.target(NMDA_type).kin_scale = kin_scale spike_times = h.Vector([equilibrate + 0.3 * i]) syn.source.play(spike_times) sim.parameters['syn_indexes'].append(spine.index) start_time = time.time() sim.run(v_init) with h5py.File(data_dir+rec_filename+'.hdf5', 'a') as f: sim.export_to_file(f, len(spine_indexes)) for index in spine_indexes: spine = spine_list[index] syn = spine.synapses[0] syn.source.play(h.Vector()) print 'Process: %i stimulated %i synapses in %i s with gmax: %.3E' % (os.getpid(), len(spine_indexes), time.time() - start_time, gmax) return rec_filename @interactive def stim_expected(spine_index): """ Called by controller, mapped to each engine. Activates a single spine specified by an index and saves the resulting output to a file. :param spine_index: int :return: str """ spine = spine_list[spine_index] syn = spine.synapses[0] syn.target(NMDA_type).gmax = gmax syn.target(NMDA_type).gamma = gamma syn.target(NMDA_type).Kd = Kd syn.target(NMDA_type).kin_scale = kin_scale spike_times = h.Vector([equilibrate]) syn.source.play(spike_times) sim.parameters['spine_index'] = spine.index start_time = time.time() sim.run(v_init) with h5py.File(data_dir+rec_filename+'.hdf5', 'a') as f: sim.export_to_file(f, spine_index) syn.source.play(h.Vector()) print 'Process: %i stimulated spine: %i in %i s with gmax: %.3E' % (os.getpid(), spine.index, time.time() - start_time, gmax) return rec_filename equilibrate = 250. # time to steady-state duration = 450. v_init = -67. syn_types = ['AMPA_KIN', NMDA_type] cell = CA1_Pyr(morph_filename, mech_filename, full_spines=True) cell.zero_na() # these synapses will not be used, but must be inserted for inheritance of synaptic parameters from trunk for branch in cell.trunk: for spine in branch.spines: syn = Synapse(cell, spine, syn_types, stochastic=0) # choose a distal apical oblique branch that has > 25 spines within 30 um, choose spines near the middle of the branch spine_list = [] for branch in (apical for apical in cell.apical if cell.get_distance_to_node(cell.tree.root, cell.get_dendrite_origin(apical)) >= 100. and cell.get_distance_to_node(cell.get_dendrite_origin(apical), apical, loc=1.) >= 80.): spine_list = [spine for spine in branch.spines if 30. <= cell.get_distance_to_node(cell.get_dendrite_origin(branch), spine, loc=0.) <= 60.] if len(spine_list) > 25: #print 'branch', branch.name, 'has', len(spine_list), 'spines within 30 um' for spine in spine_list: syn = Synapse(cell, spine, syn_types, stochastic=0) break if not spine_list: raise Exception('Could not find a branch that satisfies the specified requirements.') cell.init_synaptic_mechanisms() local_random = random.Random() local_random.seed(branch.index) local_random.shuffle(spine_list) sim = QuickSim(duration, verbose=0) sim.parameters['equilibrate'] = equilibrate sim.parameters['duration'] = duration sim.parameters['path_type'] = branch.type sim.parameters['path_index'] = branch.index sim.append_rec(cell, cell.get_dendrite_origin(branch), description='trunk', loc=1.) sim.append_rec(cell, branch, description='branch') spine = spine_list[0] sim.append_rec(cell, spine, object=spine.synapses[0].target(NMDA_type), param='_ref_g', description='NMDA_g')