File: ComputeRawConeFundamentals.m

package info (click to toggle)
psychtoolbox-3 3.0.9%2Bsvn2579.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 63,408 kB
  • sloc: ansic: 73,310; cpp: 11,139; objc: 3,129; sh: 1,669; python: 382; php: 272; makefile: 172; java: 113
file content (98 lines) | stat: -rw-r--r-- 3,522 bytes parent folder | download
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
91
92
93
94
95
96
97
98
function T_quantal = ComputeRawConeFundamentals(params,staticParams)
% T_quantal = ComputeRawConeFundamentals(params,staticParams)
%
% Function to compute normalized cone quantal sensitivities
% from underlying pieces and parameters.
%
% In the passed params structure, you can either pass
% the lambdaMax values for the photopigment, in which
% case the absorbance is computed from the specified
% nomogram, or you can pass the absorbance values
% directly in T_xxx format.  A typical choice in this
% case would be 10.^T_lgo10coneabsorbance_ss for the
% Stockman-Sharpe/CIE estimates.
%
% It's not clear that it is necessary to normalize; eventually
% this should probably be changed to provide fundamentals that
% give actual quantal efficiency.
%
% The typical use of this function is to be called by 
% ComputeCIEConeFundamentals, which sets up the
% passed structures acording to the CIE standard. 
% This routine, however, could in principle be used
% with a wide variety of choices of the component pieces.
%
% 8/12/11  dhb  Starting to make this actually work.
% 8/14/11  dhb  Change name, expand comment.

% Handle bad value
index = find(params.axialDensity <= 0.0001);
if (~isempty(index))
    params.axialDensity(index) = 0.0001;
end

% Handle optional values
if (~isfield(params,'extraLens'))
    params.extraLens = 0;
end
if (~isfield(params,'extraMac'))
    params.extraMac = 0;
end

% Prereceptor transmittance.  Sometimes adjustments of peak density
% recommended by various standards push the density less than
% zero at some wavelengths, so we need to make sure we never have
% transmittance greater than 1.
lens = 10.^-(-log10(staticParams.lensTransmittance)+params.extraLens);
lens(lens > 1) = 1;
mac = 10.^-(-log10(staticParams.macularTransmittance)+params.extraMac);
mac(mac > 1) = 1;

% Compute nomogram if absorbance wasn't passed directly.  We detect
% a direct pass by the existance of params.absorbance.
if (isfield(params,'absorbance'))
    absorbance = params.absorbance;
else
    absorbance = PhotopigmentNomogram(staticParams.S,params.lambdaMax,staticParams.whichNomogram);
end

% Compute absorbtance
%
% Handle special case where we deal with ser/ala polymorphism for L cone
if (size(absorbance,1) == 4)
    absorbtance = AbsorbanceToAbsorbtance(absorbance,staticParams.S,...
        [params.axialDensity(1) ; params.axialDensity(1) ; ...
        params.axialDensity(2) ; params.axialDensity(3)]);
elseif (size(absorbance,1) == 3)
    absorbtance = AbsorbanceToAbsorbtance(absorbance,staticParams.S,...
        [params.axialDensity(1) ; params.axialDensity(2) ; ...
        params.axialDensity(3)]);
else
    error('Unexpected number of photopigment lambda max values passed');
end

%% Put together pre-receptor and receptor parts
for i = 1:size(absorbtance,1)
    absorbtance(i,:) = absorbtance(i,:) .* lens .* mac;
end

% Put it into the right form
T_quantal = zeros(3,staticParams.S(3));

if (size(absorbtance,1) == 4)
    T_quantal(1,:) = staticParams.LserWeight*absorbtance(1,:) + ...
        (1-staticParams.LserWeight)*absorbtance(2,:);
    T_quantal(2,:) = absorbtance(3,:);
    T_quantal(3,:) = absorbtance(4,:);
elseif (size(absorbtance,1) == 3)
    T_quantal(1,:) = absorbtance(1,:);
    T_quantal(2,:) = absorbtance(2,:);
    T_quantal(3,:) = absorbtance(3,:);
else
    error('Unexpected number of photopigment lambda max values passed');
end

% Normalize to max of one for each receptor
for i = 1:size(T_quantal,1)
    T_quantal(i,:) = T_quantal(i,:)/max(T_quantal(i,:));
end