function e_fname = extract_spikes(r_fname,pathroot,structures,n_cells,threshold,seed,varargin) % EXTRACT_SPIKES samples spike trains from results % EXTRACT_SPIKES(R,PATH,S,N,T,SEED) extracts N_i spikes trains from the ith nucleus named in cell array S % (where the names must match the indices arrays e.g. SD1, STN etc) from the results file supplied % in string R, on the path PATH. The spike trains selected % will have a mean firing rate (over entire period) of at least T. (N is thus a vector). The % random number generator is initiated with SEED - this allows for % recallable random cell selection! % % % EXTRACT_SPIKES(..,P,FLAG) where P is a string creating a meaningful % prefix for the extracted results file % % Set options using FLAG: % 'c' - NOT IMPLEMENTED YET adding this flag ensures that N spikes trains are sampled from each % channel in each structure, and are saved in accordingly named arrays (set to '' to omit). % % % Returns the name of the file produced. % % Mark Humphries 4/1/2006 prefix = ''; rand('state',seed); if nargin >= 7 if ~isstr(varargin{1}) error('Supplied filename prefix is not a string') else prefix = varargin{1}; end end % load the simulation results file load(r_fname) t_out_t = double(out_t) .* dt; % convert to time n_structures = length(structures); if n_structures ~= length(n_cells) error('Cells-per-structure and structure arrays do not match'); end time_now = clock; unique_name = datestr(time_now,30); e_fname = [prefix '_' unique_name '_extracted_results']; path_fname = [pathroot e_fname '.mat']; for loop = 1:n_structures idxs = structures{loop}; for loop2 = 1:n_cells(loop) has_spikes = 0; eval(['n_possibles = length(' idxs ');']); rand_idx = randperm(n_possibles); counter = 1; % counter for the permuted sequence - if cell already discarded, no need to test it again! while ~has_spikes eval(['mean_rate = sum(out_n==' idxs '(rand_idx(counter))) / time_seconds;']); counter = counter + 1; if mean_rate >= threshold has_spikes = 1; end if counter > n_possibles error('Not enough cells had firing rates that exceeded the extraction threshold'); end end eval(['ts = t_out_t(out_n == ' idxs '(rand_idx(counter)));']); eval([idxs '_times{loop2} = ts;']); % generate cell array of spike trains for use in the analysis routines end % save newly created cell arrays if loop > 1 eval(['save(path_fname,''' idxs '_times'',''-append'');']) else eval(['save(path_fname,''' idxs '_times'');']); end end % also save the necessary simulation data (including the input arrays) save(path_fname,'input_array','trace_vals','trace_n',... 'R','theta','tau_m','tau_AMPA','tau_NMDA','tau_GABAa','spon','mlimit',... 'dt','time_seconds','p_connect',... 'n_channels','n_neurons','n_sources','n_inputs','neurons_per_nucleus','neurons_per_channel', 'n_nuclei',... 'delays','proportions','link_n','link_wAMPA','link_wNMDA','link_wGABAa','link_t',... 't_on', 't_off', 'step_size', 'switches',... 'GPi','STN','GPe','EXT','SD1','SD2','t_out_t','out_n','in_n','in_t','-append'); if exist('fast_weights') save(path_fname,'fast_weights','slow_weights','-append'); else save(path_fname,'weights','-append'); end