function output = DA_ramp_output(a,e,mI,da,type,gain,varargin)

%DA_RAMP_OUTPUT Dopamine affected unit output 
%   O = DA_RAMP_OUTPUT(A,E,M,DA,T,G,P) computes the output O of a LI unit layer,
%   given activation A, threshold E, and initial slope M arrays, dopamine level DA,
%   dopamine receptor type T (1 = D1, 2 = D2), and gain G. The pivot point
%   P is a optional parameter in that it only needs to be specified for D1
%   receptors.
%
%   Reference: Humphries, M.D. (2003). High level modeling of dopamine mechanisms 
%   in striatal neurons. Technical Report ABRG 3. Dept. Psychology
%   University of Sheffield, UK.
% 
%   Mark Humphries 21/1/2005

% check for pivot
if type==1 & nargin < 7
    error('Must specify pivot parameter for D1 receptors')
end

%%%%%%%%%%%%%
%%% below is an optimised verison of this for arrays of activations...
% if a < e
%     output = 0;
% elseif a <= 1/m + e
%     output = m * (a - e);
% else 
%     output = 1;
% end

if type == 1    % D1 model
    p = varargin{1};
    m = mI + gain .* da; 
    
    % classify outputs
    limit = (1 - (1 - m) .* p) ./ m + e;
	case_zero = find(a < e);
	case_a = find(a >= e & a <= limit);
	case_one = find(a > limit);

	% compute outputs
	output(case_zero) = 0;
	output(case_a) = m .* (a(case_a) - e) + (1 - m) .* p;
	output(case_one) = 1;
    
elseif type == 2 % D2 model
    m = mI - gain .* da; 
    
    % case statement same as original ramp function
	case_zero = find(a < e);
	case_a = find(a >= e & a <= 1/m +e);
	case_one = find(a > 1/m + e);
	
	output(case_zero) = 0;
	output(case_a) = m .* (a(case_a) - e);
	output(case_one) = 1;
else
    error('Unknown dopamine receptor type specified')
end