/usr/share/psychtoolbox-3/PsychCal/RefitCalGamma.m is in psychtoolbox-3-common 3.0.11.20131230.dfsg1-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | % RefitCalGamma
%
% Refit the gamma data from a calibration.
%
% See also CalDemo, CalibrateFitGamma, SetGammaMethod, GamutToSettings
%
% 3/27/02 dhb Wrote it.
% 8/26/03 dhb, jl Allow changing dacsize of calibraiton. Useful for dropping from 10 to 8.
% 2/2/05 dhb, dam Ask for filename to save to, rather than automatically overwrite.
% 9/26/08 dhb, ijk, tyl Simplify naming possibilities. Add some better help.
% 9/27/08 dhb Fix up dacsize fitting.
% Clearer prompts (show default values).
% 11/19/09 dhb Added crtSumPow option. This works great for our FrontRoom monitor, which
% was not well fit by the traditional gamma model. The work is done in
% function CalibrateFitGamma. See comments there.
% 11/20/09 dhb More terms in crtSumPow.
% 3/07/10 dhb Call CalibrateFitLinMod as well.
% 3/08/10 dhb Update list of fit type options.
% 5/28/10 dhb Add yoked fitting routine to calls. Should have no effect when yoked isn't set, but do the right thing when it is.
% 6/5/10 dhb Update type list provided to user.
% dhb Better plots, using plot subroutines.
% 5/26/12 dhb Added ability to use raw measured data as the fit gamma table. See comment where that's done below.
% Enter load code
defaultFileName = 'PTB3TestCal';
thePrompt = sprintf('Enter calibration filename [%s]: ',defaultFileName);
newFileName = input(thePrompt,'s');
if (isempty(newFileName))
newFileName = defaultFileName;
end
fprintf(1,'\nLoading from %s.mat\n',newFileName);
cal = LoadCalFile(newFileName);
fprintf('Calibration file %s read\n\n',newFileName);
% Print out some information from the calibration.
DescribeMonCal(cal);
% Provide information about gamma measurements
% This is probably not method-independent.
fprintf('Gamma measurements were made at %g levels\n',...
size(cal.rawdata.rawGammaInput,1));
fprintf('Gamma table available at %g levels\n',...
size(cal.gammaInput,1));
% Get new fit type
fprintf('Old gamma fit type was: %s\n',cal.describe.gamma.fitType);
oldType = cal.describe.gamma.fitType;
fprintf('Possible fit types are defined by routine CalibrateFitGamma\n');
fprintf('See "help CalibrateFitGamma for most up to date options (except for rawdata)\n');
fprintf('Current (May 2012) options are:\n');
fprintf('\tsimplePower\n');
fprintf('\tcrtLinear\n');
fprintf('\tcrtPolyLinear\n');
fprintf('\tcrtGamma\n');
fprintf('\tcrtSumPow\n');
fprintf('\tbetacdf\n');
fprintf('\tsigmoid\n');
fprintf('\tweibull\n');
fprintf('\trawdata\n');
gamma.fitType= GetWithDefault('Enter new fit type',oldType);
cal.describe.gamma = gamma;
if (strcmp(gamma.fitType,'betacdf'))
cal.describe.gamma.useweight = GetWithDefault('Enter weighting constant (-1 -> no weighting)',0.01);
end
% Get new number of bits
fprintf('Old DAC bits was: %d\n',cal.describe.dacsize);
oldDacsize = cal.describe.dacsize;
cal.describe.dacsize = input(sprintf('Enter new dacsize: [%d]: ',oldDacsize));
if (isempty(cal.describe.dacsize))
cal.describe.dacsize = oldDacsize;
end
% Change dacsize? Used every once in a while.
if (cal.describe.dacsize ~= oldDacsize)
bits = cal.describe.dacsize;
end
% Now refit
cal = CalibrateFitLinMod(cal);
cal = CalibrateFitYoked(cal);
% Switch about whether to call standard routine
switch (gamma.fitType)
% Literally use the measured data as the fit data.
% You only want to do this under very unusual circumstances.
% The reason I'm putting it in is to deal with a DLP projector
% whose filter wheel I ripped out, and for which the light output
% is highly non-monotonic with input. So, I'll measure at every
% possible input settings and then use exhaustive search of the
% gamma table to invert. This is where the output of the standard
% calibration program pushes the raw data into the typical field.
%
% This is probably a fairly fragile bit of code and should only be used
% with caution and knowledge aforethought.
%
% I put this here rather than in CalibrateFitGamma to avoid a lot of
% massaging done by that routine, which we do not want.
case 'rawdata'
if (size(cal.rawdata.rawGammaTable,2) ~= cal.nDevices*cal.nPrimaryBases)
error('Dimensions of raw data are not correct, given number of devices and linear model size')
end
cal.gammaInput = cal.rawdata.rawGammaInput;
cal.gammaTable = cal.rawdata.rawGammaTable;
cal.gammaTable(cal.gammaTable < 0) = 0;
cal.gammaTable(cal.gammaTable > 1) = 1;
% Fit the measured data using standard PTB methods
otherwise
cal = CalibrateFitGamma(cal,2^cal.describe.dacsize);
end
% Put up a plot of the essential data
CalibratePlotSpectra(cal,figure(1));
CalibratePlotGamma(cal,figure(2));
drawnow;
% Option to save the refit file
saveIt = input('Save new fit data (0->no, 1->yes)? [0]: ');
if (isempty(saveIt))
saveIt = 0;
end
if (saveIt)
% Prompt for new file name if we're saving to a name.
defaultFileName = newFileName;
thePrompt = sprintf('Enter calibration filename [%s]: ',defaultFileName);
saveFileName = input(thePrompt,'s');
if (isempty(saveFileName))
saveFileName = defaultFileName;
end
fprintf(1,'\nSaving to %s.mat\n',saveFileName);
SaveCalFile(cal,saveFileName);
end
|