% KisoHB_Fundamentals_vs_Luminosity.m
% 
% Stockman & Sharpoe (2000)による錐体分光感度と明所視分光視感効率との関係を検証する。
% また、Psychophysics toolbox ver.3で提供されているデータの精度を検証する。
% http://www.cvrl.org/によると、2°視野の分光視感効率はVF(λ)は以下のように表せる。
% VF(λ) = 0.689903 L(λ)  + 0.348322 M(λ)  （エネルギー単位）
% 実際に逆算して、検証する。
%

clear all; close all;

%% http://www.cvrl.org/で提供されているデータで検証

%  Stockman & Sharpoe (2000)による錐体分光感度の読み込み
% データは、カレント・ディレクトリーに保存されているものとする。
buf = csvread('linss2_10e_1.csv');		% 1 nmステップ
T_cones_ss2_ORG = buf(:,2:4)';
S_cones_ss2_ORG = [buf(1,1), 1, size(buf,1)];

%  Stockman & Sharpoe (2000)による10-deg 錐体分光感度の読み込み
% buf = csvread('linss10e_1.csv');		% 1 nmステップ
% T_cones_ss10_ORG = buf(:,2:4)';
% S_cones_ss10_ORG = [buf(1,1), 1, size(buf,1)];

% 分光視感効率の読み込み
% CIE "physiologically-relevant" luminous efficiency functions consistent with 
% the Stockman & Sharpe cone fundamentals
buf = csvread('linCIE2008v2e_1.csv');
nData = size(buf,1);
T_CIE_Y2_ORG = buf(:,2)';

factors = (T_cones_ss2_ORG(1:2,:)'\T_CIE_Y2_ORG');
fprintf('http://www.cvrl.org/\n');
fprintf('VF = %8.6f L + %8.6f M\n', factors(1), factors(2));

%% Psychtoolbox で提供されているデータで検証

%  Stockman & Sharpoe (2000)による錐体分光感度の読み込み
load T_cones_ss2;

% 分光視感効率の読み込み
% CIE "physiologically-relevant" luminous efficiency functions consistent with 
% the Stockman & Sharpe cone fundamentals
load T_CIE_Y2;
% 確認したところ、これはT_CIE_Y2_ORGと一致する

factors2 = (T_cones_ss2(1:2,:)'\T_CIE_Y2');
fprintf('PTB3\n');
fprintf('VF = %8.6f L + %8.6f M\n', factors2(1), factors2(2));

%% コメント

% オリジナルのデータでは、Webに記載されている係数と同じ値が得られるが、PTB3のデータの場合には一致しない。
% これはデータの桁数によるもの（下記を参照）。
% 
% 実用上は問題ないはずだが、PTBの関数 LMSToMacBoyn は、T_conesとT_lumから係数を逆算している（したがって、
% そのままだと上記計算のfactors2の方を使う）ので注意すること。

% >> T_cones_ss2(:,1:5)
% ans =
%    0.000415000000000   0.000503000000000   0.000607000000000   0.000732000000000   0.000879000000000
%    0.000368000000000   0.000448000000000   0.000544000000000   0.000659000000000   0.000796000000000
%    0.009550000000000   0.011500000000000   0.013800000000000   0.016600000000000   0.019900000000000
% >> T_cones_ss2_ORG(:,1:5)
% ans =
%    0.000415003000000   0.000502650000000   0.000607367000000   0.000731850000000   0.000879012000000
%    0.000368349000000   0.000448015000000   0.000543965000000   0.000658983000000   0.000796121000000
%    0.009547290000000   0.011479400000000   0.013798600000000   0.016574600000000   0.019886900000000

%%

% 秘密の呪文
% OurT_cones_ss2=T_cones_ss2_ORG;
% OurS_cones_ss2=S_cones_ss2_ORG;
% save('OurT_cones_ss2','OurS_cones_ss2','OurT_cones_ss2');
%
% OurT_cones_ss10=T_cones_ss10_ORG;
% OurS_cones_ss10=S_cones_ss10_ORG;
% save('OurT_cones_ss10','OurS_cones_ss10','OurT_cones_ss10');
