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
|
function [T_absorbance] = DawisNomogram(S,lambdaMax)
% [T_absorbance] = DawisNomogram(S,lambdaMax)
%
% Compute normalized absorbance according to the
% nomogram provided in Dawis, 1981, Vision Research,
% Vol. 21, pp. 1427-1430.
%
% T_absorbance contains the absorbance.
% This is specified according to the CVRL web page
% definition absorbance = log(I_incident/I_transmitted),
% so the numbers are all positive. The peak is normalized
% to one.
%
% For low density, the absorbance has the same shape as
% the spectral senstivity.
%
% The nomogram is shifted along the wavelength axis
% using a multiplicative rather than additive procedure.
%
% The result is in quantal units, in the sense that to compute
% absorptions you want to incident spectra in quanta.
% To get sensitivity in energy units, apply EnergyToQuanta().
%
% Argument lambdaMax may be a column vector of wavelengths.
%
% 10/30/97 dhb Wrote it.
% 07/01/03 dhb Add computation of T_absorbance.
% These are the coefficients for the polynomial
% approximation, taken from Table 1. We implement
% the A1-based pigment nomogram, not the A2.
Lmax = [432 ; 502 ; 562];
bN = [0.346325 -35.1001 63.3807 -125.466 10962.7 -16244.8 -210671.0 -23776.9 ; ...
-0.0106836 -28.28 148.133 -498.627 -1457.94 12799.4 -789.371 -60749.2 ; ...
-0.228262 -22.9974 87.0027 -636.336 2624.45 4948.6 -45944.6 65688.5 ];
lmaxLow = [410 ; 470 ; 530];
lmaxHigh = [470 ; 530 ; 610];
L1 = [380 ; 400 ; 430 ];
L2 = [510 ; 620 ; 690 ];
% Get wls argument.
wls = MakeItWls(S);
[nWls,nil] = size(wls);
[nT,nil] = size(lambdaMax);
T_absorbance = zeros(nT,nWls);
wlsum = wls/1000;
for i = 1:nT
theMax = lambdaMax(i);
if (theMax >= lmaxLow(1) && theMax <= lmaxHigh(1))
which = 1;
elseif (theMax > lmaxLow(2) && theMax <= lmaxHigh(2))
which = 2;
elseif (theMax > lmaxLow(3) && theMax <= lmaxHigh(3))
which = 3;
else
error(sprintf('Lambda Max %g not in range of nomogram\n',theMax));
end
wlsVec = (theMax ./ wls') - 1;
logS = zeros(1,nWls);
for k = 1:8
logS = logS + bN(which,k)*wlsVec.^k;
end
T_absorbance(i,:) = logS;
% Zero sensitivity outsize valid range. I shift the
% range in the table to slide multiplicatively with
% theMax.
zeroLow = theMax*L1(which)/Lmax(which);
zeroHigh = theMax*L2(which)/Lmax(which);
index = find(wls < zeroLow);
T_absorbance(i,index) = -Inf;
index = find(wls > zeroHigh);
T_absorbance(i,index) = -Inf;
end
T_absorbance = 10.^T_absorbance;
|