1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
function [params] = ValetonVanNorrenParams(logIsoRate,photoreceptors,trolandType,LMRatio)
% [params] = ValetonVanNorrenParams(logIsoRate,[photoreceptors],[trolandType],[LMRatio])
%
% Return a structure containting the parameters of the
% Valeton and VanNorren model of cone adaptation
% as a function of the number of isomerizations per cone per
% second. The structure also contains the table of trolands
% and corresponding isomerization rates used to spline the
% published numbers.
%
% Valeton and Van Norren (1983, Vision Research, pp. 1539-1547)
% provide their parameters as a function of the number of trolands
% incident on their monkey retina. We convert this to isomerizations
% per cone, so that we can work in more interesting physical units.
%
% The conversion involves making assumptions about a lot of constants.
% The assumptions are encapsulated by the photoreceptors structure
% and the passed eye length source and troland type.
%
% photoreceptors - structure interpreted by RetIrradianceToIsoRecSec.
% eyeLengthSource - string or value interpreted by EyeLength.
% trolandType - string interpreted by TrolandsToRetIrradiance.
% LMRatio - value of L to M cone ratio to assume for original measurements (Default 2).
%
% The parameters are provided in Table 1 of the paper, for a range
% of troland values. The model parameters are sigmaL and gamma.
% and gamma.
%
% See also: TrolandsToRetIrradiance, RetIrradianceToIsoRecSec, EyeLength,
% DefaultPhotoreceptors, FillInPhotoreceptors.
%
% 7/18/03 dhb Started writing it.
% Fill in default
if (nargin < 2 || isempty(photoreceptors))
photoreceptors = DefaultPhotoreceptors('LivingHumanFovea');
photoreceptors.macularPigmentDensity.source = 'None';
photoreceptors = FillInPhotoreceptors(photoreceptors);
end
if (nargin < 3 || isempty(trolandType))
trolandType = 'Photopic';
end
if (nargin < 4 || isempty(LMRatio))
LMRatio = 2;
end
% Fill in the values for the photoreceptors structure
S = photoreceptors.nomogram.S;
% Type in what we need of Table 1. Take the lowest
% level as 1 log td.
logBackgroundTd = [1 2 3 4 5 6];
logSigmaAlpha = [3.2 3.5 3.9 4.4 5.2 6.3];
gamma = [1 0.93 0.82 0.68 0.59 0.62];
% Load in the arc lamp spectrum used in the experiments
load spd_xenonArc
% Convert trolands used in the experiment to quanta per
% cone per second. Valeton and Van Norren use human trolands,
% even though they are studying monkey.
for i = 1:length(logBackgroundTd)
trolands = 10^logBackgroundTd(i);
if (strcmp(photoreceptors.eyeLengthMM.source,'Value provided directly'))
irradianceWatts = TrolandsToRetIrradiance(spd_xenonArc,S_xenonArc,trolands, ...
trolandType,photoreceptors.species,photoreceptors.eyeLengthMM.value);
else
irradianceWatts = TrolandsToRetIrradiance(spd_xenonArc,S_xenonArc,trolands, ...
trolandType,photoreceptors.species,photoreceptors.eyeLengthMM.source);
end
irradianceWatts = SplineSpd(S_xenonArc,irradianceWatts,S);
[isoPerConeSec] = RetIrradianceToIsoRecSec(irradianceWatts,S,photoreceptors);
averageRate = (LMRatio/(LMRatio+1))*isoPerConeSec(1) + (1/(LMRatio+1))*isoPerConeSec(2);
logBackgroundIsoRate(i) = log10(averageRate);
end
% Now get actual parameters by splining
if (logIsoRate < logBackgroundIsoRate(1))
params.logSigmaAlpha = logSigmaAlpha(1);
params.gamma = gamma(1);
elseif (logIsoRate > logBackgroundIsoRate(end))
params.logSigmaAlpha = logSigmaAlpha(end);
params.gamma = gamma(end);
else
params.logSigmaAlpha = interp1(logBackgroundIsoRate,logSigmaAlpha,logIsoRate,'linear');
params.gamma = interp1(logBackgroundIsoRate,gamma,logIsoRate,'linear');
end
params.logBackgroundTds = logBackgroundTd;
params.logBackgroundIsoRates = logBackgroundIsoRate;
|