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