def get_env_spike_dict(env, include_artificial=True): """ Constructs a dictionary with per-gid per-trial spike times from the output vectors with spike times and gids contained in env. """ equilibration_duration = float( env.stimulus_config['Equilibration Duration']) n_trials = env.n_trials t_vec = env.t_vec.as_numpy() id_vec = np.asarray(env.id_vec.as_numpy(), dtype=np.uint32) trial_time_ranges = get_trial_time_ranges(env.t_rec.to_python(), env.n_trials) trial_time_bins = [ t_trial_start for t_trial_start, t_trial_end in trial_time_ranges ] trial_dur = np.asarray([env.tstop + equilibration_duration] * n_trials, dtype=np.float32) binlst = [] typelst = sorted(env.celltypes.keys()) binvect = np.asarray([env.celltypes[k]['start'] for k in typelst]) sort_idx = np.argsort(binvect, axis=0) pop_names = [typelst[i] for i in sort_idx] bins = binvect[sort_idx][1:] inds = np.digitize(id_vec, bins) pop_spkdict = {} for i, pop_name in enumerate(pop_names): spkdict = {} sinds = np.where(inds == i) if len(sinds) > 0: ids = id_vec[sinds] ts = t_vec[sinds] for j in range(0, len(ids)): gid = ids[j] t = ts[j] if (not include_artificial) and ( gid in env.artificial_cells[pop_name]): continue if gid in spkdict: spkdict[gid].append(t) else: spkdict[gid] = [t] for gid in spkdict: spiketrain = np.array(spkdict[gid], dtype=np.float32) if gid in env.spike_onset_delay: spiketrain -= env.spike_onset_delay[gid] trial_bins = np.digitize(spiketrain, trial_time_bins) - 1 trial_spikes = [ np.copy(spiketrain[np.where(trial_bins == trial_i)[0]]) for trial_i in range(env.n_trials) ] for trial_i, trial_spiketrain in enumerate(trial_spikes): trial_spiketrain -= np.sum( trial_dur[:(trial_i)]) + equilibration_duration spkdict[gid] = trial_spikes pop_spkdict[pop_name] = spkdict return pop_spkdict
def recsout(env, output_path, t_start=None, clear_data=False, write_cell_location_data=False, write_trial_data=False): """ Writes intracellular state traces to specified NeuroH5 output file. :param env: :param output_path: :param clear_data: :param reduce_data: :return: """ t_rec = env.t_rec equilibration_duration = float( env.stimulus_config['Equilibration Duration']) reduce_data = env.recording_profile.get('reduce', None) n_trials = env.n_trials trial_time_ranges = get_trial_time_ranges(env.t_rec.to_python(), env.n_trials) trial_time_bins = [ t_trial_start for t_trial_start, t_trial_end in trial_time_ranges ] trial_dur = np.asarray([env.tstop + equilibration_duration] * n_trials, dtype=np.float32) for pop_name in sorted(env.celltypes.keys()): local_rec_types = list(env.recs_dict[pop_name].keys()) rec_types = sorted( set(env.comm.allreduce(local_rec_types, op=mpi_op_concat))) for rec_type in rec_types: recs = env.recs_dict[pop_name][rec_type] attr_dict = defaultdict(lambda: {}) for rec in recs: gid = rec['gid'] data_vec = np.array(rec['vec'], copy=clear_data, dtype=np.float32) time_vec = np.array(t_rec, copy=clear_data, dtype=np.float32) if t_start is not None: time_inds = np.where(time_vec >= t_start)[0] time_vec = time_vec[time_inds] data_vec = data_vec[time_inds] trial_bins = np.digitize(time_vec, trial_time_bins) - 1 for trial_i in range(n_trials): trial_inds = np.where(trial_bins == trial_i)[0] time_vec[trial_inds] -= np.sum( trial_dur[:(trial_i)]) + equilibration_duration label = rec['label'] if label in attr_dict[gid]: if reduce_data is None: raise RuntimeError( 'recsout: duplicate recorder labels and no reduce strategy specified' ) elif reduce_data is True: attr_dict[gid][label] += data_vec else: raise RuntimeError( 'recsout: unsupported reduce strategy specified') else: attr_dict[gid][label] = data_vec attr_dict[gid]['t'] = time_vec if write_trial_data: attr_dict[gid]['trial duration'] = trial_dur if write_cell_location_data: distance = rec.get('distance', None) if distance is not None: attr_dict[gid]['distance'] = np.asarray( [distance], dtype=np.float32) section = rec.get('section', None) if section is not None: attr_dict[gid]['section'] = np.asarray([section], dtype=np.int16) loc = rec.get('loc', None) if loc is not None: attr_dict[gid]['loc'] = np.asarray([loc], dtype=np.float32) if clear_data: rec['vec'].resize(0) if env.results_namespace_id is None: namespace_id = "Intracellular %s" % (rec_type) else: namespace_id = "Intracellular %s %s" % ( rec_type, str(env.results_namespace_id)) append_cell_attributes(output_path, pop_name, attr_dict, namespace=namespace_id, comm=env.comm, io_size=env.io_size) if clear_data: env.t_rec.resize(0) env.comm.barrier() if env.comm.Get_rank() == 0: logger.info("*** Output intracellular state results to file %s" % output_path)
def spikeout(env, output_path, t_start=None, clear_data=False): """ Writes spike times to specified NeuroH5 output file. :param env: :param output_path: :param clear_data: :return: """ equilibration_duration = float( env.stimulus_config['Equilibration Duration']) n_trials = env.n_trials t_vec = np.array(env.t_vec, dtype=np.float32) id_vec = np.array(env.id_vec, dtype=np.uint32) trial_time_ranges = get_trial_time_ranges(env.t_rec.to_python(), env.n_trials) trial_time_bins = [ t_trial_start for t_trial_start, t_trial_end in trial_time_ranges ] trial_dur = np.asarray([env.tstop + equilibration_duration] * n_trials, dtype=np.float32) binlst = [] typelst = sorted(env.celltypes.keys()) binvect = np.asarray([env.celltypes[k]['start'] for k in typelst]) sort_idx = np.argsort(binvect, axis=0) pop_names = [typelst[i] for i in sort_idx] bins = binvect[sort_idx][1:] inds = np.digitize(id_vec, bins) if env.results_namespace_id is None: namespace_id = "Spike Events" else: namespace_id = "Spike Events %s" % str(env.results_namespace_id) for i, pop_name in enumerate(pop_names): spkdict = {} sinds = np.where(inds == i) if len(sinds) > 0: ids = id_vec[sinds] ts = t_vec[sinds] for j in range(0, len(ids)): gid = ids[j] t = ts[j] if (t_start is None) or (t >= t_start): if gid in spkdict: spkdict[gid]['t'].append(t) else: spkdict[gid] = {'t': [t]} for gid in spkdict: spiketrain = np.array(spkdict[gid]['t'], dtype=np.float32) if gid in env.spike_onset_delay: spiketrain -= env.spike_onset_delay[gid] trial_bins = np.digitize(spiketrain, trial_time_bins) - 1 trial_spikes = [ np.copy(spiketrain[np.where(trial_bins == trial_i)[0]]) for trial_i in range(n_trials) ] for trial_i, trial_spiketrain in enumerate(trial_spikes): trial_spiketrain = trial_spikes[trial_i] trial_spiketrain -= np.sum( trial_dur[:(trial_i)]) + equilibration_duration spkdict[gid]['t'] = np.concatenate(trial_spikes) spkdict[gid]['Trial Duration'] = trial_dur spkdict[gid]['Trial Index'] = np.asarray(trial_bins, dtype=np.uint8) append_cell_attributes(output_path, pop_name, spkdict, namespace=namespace_id, comm=env.comm, io_size=env.io_size) del (spkdict) if clear_data: env.t_vec.resize(0) env.id_vec.resize(0) env.comm.barrier() if env.comm.Get_rank() == 0: logger.info("*** Output spike results to file %s" % output_path)