File: AbsorptanceToAbsorbance.m

package info (click to toggle)
psychtoolbox-3 3.0.19.14.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 86,796 kB
  • sloc: ansic: 176,245; cpp: 20,103; objc: 5,393; sh: 2,753; python: 1,397; php: 384; makefile: 193; java: 113
file content (64 lines) | stat: -rw-r--r-- 3,059 bytes parent folder | download | duplicates (6)
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
function [absorbanceSpectra, absorbanceSpectraWls] =...
    AbsorptanceToAbsorbance(absorptanceSpectra, absorptanceSpectraWls, axialOpticalDensities, NORMALIZE)
% [absorbanceSpectra, absorbanceSpectraWls] =...
%   AbsorptanceToAbsorbance(absorptanceSpectra, absorptanceSpectraWls, axialOpticalDensities, [NORMALIZE])
%
% This code inverts AbsorbanceToAbsorptance.  You might want to do this if you were trying
% to take cone fundamentals and back down all the way to the component parts, so that you
% could for example vary the axial density and recompute the fundamentals.
%
% The absorbance/absorptance terminology is described at the
% CVRL web page, http://cvrl.ucl.ac.uk.  Wyszecki and Stiles refere to absorbance
% the absorption coefficient (p. 588).
%
% Both absorptance spectra and absorbance spectra describe quantal absorption.
%
% Absorbance spectra are normalized to a peak value of 1.
% Absorptance spectra are the proportion of quanta actually absorbed.
%
% Equation: absorptanceSpectra = 1 - 10.^(-OD * absorbanceSpectra)
%
% Multiple spectra may be passed in the rows of absorbanceSpectra.  If
% so, then the same number of densities should be passed in the vector
% axialOpticalDensities, and multiple answers are returned in the rows
% of absorptanceSpectra.
%
% NORMALIZE (default true) causes this routine to normalize the returned absorbances to
% have a maximum of 1.
%
% Note, we now have ways of building up most fundamentals that we care about
% from constituant parts, and thus probably don't need to do that.  See
%   CIEConeConeFundamentlsTest, ComputeCIEConeFundamentals, DefaultPhotoreceptors, FillInPhotoreceptors,
%   IsomerizationsInEyeDemo.
%
% Originally written by HH, Copyright HH, Vista Lab, 2010
%
% 8/11/13  dhb  Moved into PTB, modified comments so as not to refer to non-PTB routines.
%          dhb  That this actually inverts is tested in IsomerizationsInEyeDemo.
% 12/02/13 dhb  Fix spelling of "absorptance" in routine names and throughout.


% Some arg checks
if ~exist('absorptanceSpectra','var'); help AbsorptanceToAbsorbance; return; end
if ~exist('axialOpticalDensities','var'); disp('axialOpticalDensities is required.'); return; end
if ~exist('absorptanceSpectraWls','var'); absorptanceSpectraWls = []; end
if ~exist('NORMALIZE','var'); NORMALIZE = true; end

% Convert each entry
for i = 1:size(absorptanceSpectra,1)
    % Normalize absorptanceSpectance so that returned absorbance has peak of 1, no matter what
    % normalization was applied to the absorptance spectrum.  
    if (NORMALIZE)
        absorptanceSpectra(i,:) = absorptanceSpectra(i,:) ./ max(absorptanceSpectra(i,:)) * (1-10^-axialOpticalDensities(i));
    end
    
    % Invert the absorbance to absorptance computation
    absorbanceSpectra(i,:) = (- 1 ./ axialOpticalDensities(i)) .* log10(absorptanceSpectra(i,:) - 1);
end

% Deal with some possible numerical error
absorbanceSpectra = real(absorbanceSpectra); % remove small value of imaginary number

% Pass wavelengths back through
absorbanceSpectraWls = absorptanceSpectraWls;