% Modified by PWJ on 12/30/2010
%
% This will generate a synapse activation text block that can be plugged
% directly into a NEURON simulation given a set of synaptic positions
% and timings, and conductances (three vectors of equal size).  The other variables are the 
% proerties of the synapse.
%
% to call multiple blocks for a single simulation, pass the first_syn var
% so that synapse indexing is incremented
%
% cmpt_dens -- if assigned, will scale gmax by cmpt_dens(x) for compartment x
function synblock = generate_synblock(timing_vec, cmpt_vec, gmax, tau_syn, erev, jitter_max, first_syn, cmpt_dens)
	sidx = 1;

  disp(['Generating ' num2str(length(timing_vec)) ' synapses ...']);

	% The main loop
	for t=1:length(timing_vec)
        if (length(cmpt_dens) > 0)
            gsf = cmpt_dens(floor(cmpt_vec(t)));
        else
            gsf = 1;
        end
        if (length(gmax) > 1) %if gmax is a vector then use this string generation
            sblock{sidx} = [sprintf('  objref syn_%d\n', t+first_syn), ...
                sprintf('  seg[%d] syn_%d = new AlphaSynapse(%f)\n', floor(cmpt_vec(t)), t+first_syn, cmpt_vec(t)-floor(cmpt_vec(t))), ...
                sprintf('  syn_%d.onset = %g\n', t+first_syn, timing_vec(t)), ....
                sprintf('  syn_%d.tau = %g\n', t+first_syn, tau_syn), ...
                sprintf('  syn_%d.gmax = %g\n', t+first_syn, gmax(t)*gsf), ...
                sprintf('  syn_%d.e = %d\n', t+first_syn, erev), ...
                sprintf('  \n')];
        else % use one that doesn't index gmax
            sblock{sidx} = [sprintf('  objref syn_%d\n', t+first_syn), ...
                sprintf('  seg[%d] syn_%d = new AlphaSynapse(%f)\n', floor(cmpt_vec(t)), t+first_syn, cmpt_vec(t)-floor(cmpt_vec(t))), ...
                sprintf('  syn_%d.onset = %g\n', t+first_syn, timing_vec(t)), ....
                sprintf('  syn_%d.tau = %g\n', t+first_syn, tau_syn), ...
                sprintf('  syn_%d.gmax = %g\n', t+first_syn, gmax*gsf), ...
                sprintf('  syn_%d.e = %d\n', t+first_syn, erev), ...
                sprintf('  \n')];
        end
        sidx = sidx + 1;
	end

% Now generate file output ... 	
synblock = char(sblock);
a = synblock';
synblock = a(:)';