annotate multithreshold 1.46/printReport.m @ 7:573c75007cf4

new intpow functions
author Ray Meddis <rmeddis@essex.ac.uk>
date Fri, 27 May 2011 14:29:28 +0100
parents f233164f4c86
children ecad0ea62b43
rev   line source
rmeddis@0 1 function printReport(fileName, printTracks)
rmeddis@0 2
rmeddis@0 3 % End of run report (no args)
rmeddis@0 4 % *or*
rmeddis@0 5 % reprint previous report from file
rmeddis@0 6
rmeddis@0 7 global experiment stimulusParameters betweenRuns withinRuns statsModel audio
rmeddis@0 8 global LevittControl expGUIhandles
rmeddis@0 9
rmeddis@0 10
rmeddis@0 11 global inputStimulusParams OMEParams DRNLParams
rmeddis@0 12 global IHC_VResp_VivoParams IHCpreSynapseParams AN_IHCsynapseParams
rmeddis@0 13 global MacGregorParams MacGregorMultiParams filteredSACFParams
rmeddis@0 14 global experiment % used by calls from multiThreshold only
rmeddis@0 15 global IHC_cilia_RPParams
rmeddis@0 16
rmeddis@0 17
rmeddis@0 18 printReportGuide.structures=1;
rmeddis@0 19 printReportGuide.showPsychometric=0;
rmeddis@0 20 printReportGuide.HorizontalTracks=1;
rmeddis@0 21
rmeddis@0 22 if nargin==0
rmeddis@0 23 % print new report
rmeddis@0 24 printReportGuide.showTracks=experiment.printTracks;
rmeddis@0 25 printReportGuide.fileName=[];
rmeddis@0 26 if experiment.saveData
rmeddis@0 27 saveFileName=['savedData/' experiment.name '_' experiment.date '_' experiment.paradigm];
rmeddis@0 28 else
rmeddis@0 29 % overwrite existing file just in case
rmeddis@0 30 saveFileName=['savedData/mostRecentResults'];
rmeddis@0 31 end
rmeddis@0 32 experiment.minElapsed=etime(clock, betweenRuns.timeNow)/60;
rmeddis@0 33 save(saveFileName, 'experiment', 'stimulusParameters', 'betweenRuns', 'withinRuns', 'statsModel', 'expGUIhandles')
rmeddis@0 34 disp(['data saved as: ' saveFileName]);
rmeddis@0 35
rmeddis@0 36 else
rmeddis@0 37 % reprint request
rmeddis@0 38 printReportGuide.fileName=fileName;
rmeddis@0 39 load(printReportGuide.fileName)
rmeddis@0 40 saveFileName=printReportGuide.fileName;
rmeddis@0 41 if nargin>1
rmeddis@0 42 printReportGuide.showTracks=printTracks;
rmeddis@0 43 else
rmeddis@0 44 printReportGuide.showTracks=experiment.printTracks;
rmeddis@0 45 end
rmeddis@0 46 end
rmeddis@0 47
rmeddis@0 48 fprintf('******** multithreshold ')
rmeddis@0 49 x=pwd; disp(['version ' x(end-3:end)])
rmeddis@0 50 fprintf('\nName:\t%s ', experiment.name)
rmeddis@0 51 fprintf('\nparadigm:\t%s ', experiment.paradigm)
rmeddis@0 52 fprintf('\nEar:\t%s ', experiment.ear)
rmeddis@0 53 method=experiment.threshEstMethod;
rmeddis@0 54 if stimulusParameters.includeCue && ~strcmp(method(1:6),'2I2AFC')
rmeddis@0 55 method=[method '/ withCue'];
rmeddis@0 56 end
rmeddis@0 57 fprintf('\nmethod:\t%s ', method)
rmeddis@0 58 fprintf('\ndate:\t%s ', experiment.date)
rmeddis@0 59
rmeddis@0 60 fprintf('\n\n')
rmeddis@0 61
rmeddis@0 62 if isempty(betweenRuns.thresholds)
rmeddis@0 63 disp('no thresholds found')
rmeddis@0 64 end
rmeddis@0 65
rmeddis@0 66 % prepare results as matrices ready to print
rmeddis@0 67 [idx1, idx2, var1values, var2values]=...
rmeddis@0 68 sortVariables(betweenRuns.variableList1, betweenRuns.variableList2, betweenRuns.var1Sequence, betweenRuns.var2Sequence);
rmeddis@0 69
rmeddis@0 70 % if strcmp(betweenRuns.variableName2, 'none')
rmeddis@0 71 % betweenRuns.variableName2=' ';
rmeddis@0 72 % end
rmeddis@0 73 header1=betweenRuns.variableName1;
rmeddis@0 74 header2=betweenRuns.variableName2;
rmeddis@0 75 header1 = strrep(header1, 'none', ' '); % none is not a useful header
rmeddis@0 76 header2 = strrep(header2, 'none', ' '); % none is not a useful header
rmeddis@0 77 headers=strvcat([header1 '/'], header2);
rmeddis@0 78
rmeddis@0 79 disp('thresholds')
rmeddis@0 80 msg=printTabTable(sortTablesForPrinting(idx1,idx2,var1values,var2values, betweenRuns.thresholds), headers);
rmeddis@0 81 addToMsg(msg,0)
rmeddis@0 82 fprintf('\n')
rmeddis@0 83
rmeddis@0 84 % sort tracks into the same order
rmeddis@0 85 betweenRuns.levelTracks=betweenRuns.levelTracks(idx1);
rmeddis@0 86 betweenRuns.responseTracks=betweenRuns.responseTracks(idx1);
rmeddis@0 87 betweenRuns.bestThresholdTracks=betweenRuns.bestThresholdTracks(idx1);
rmeddis@0 88
rmeddis@0 89 betweenRuns.levelTracks=betweenRuns.levelTracks(idx2);
rmeddis@0 90 betweenRuns.responseTracks=betweenRuns.responseTracks(idx2);
rmeddis@0 91 betweenRuns.bestThresholdTracks=betweenRuns.bestThresholdTracks(idx2);
rmeddis@0 92
rmeddis@0 93 if printReportGuide.structures
rmeddis@0 94 maxNoArrayValues=30;
rmeddis@0 95 showStructureSummary(stimulusParameters, 'stimulusParameters', maxNoArrayValues)
rmeddis@0 96 showStructureSummary(experiment, 'experiment',maxNoArrayValues)
rmeddis@0 97 showStructureSummary(betweenRuns, 'betweenRuns',maxNoArrayValues)
rmeddis@0 98 showStructureSummary(withinRuns, 'withinRuns')
rmeddis@0 99
rmeddis@0 100 switch experiment.threshEstMethod
rmeddis@0 101 case {'2I2AFC++', '2I2AFC+++'}
rmeddis@0 102 showStructureSummary(LevittControl, 'LevittControl', maxNoArrayValues)
rmeddis@0 103 end
rmeddis@0 104
rmeddis@0 105 switch experiment.ear
rmeddis@0 106 case {'statsModelLogistic','statsModelRareEvent'}
rmeddis@0 107 showStructureSummary(statsModel, 'statsModel', maxNoArrayValues)
rmeddis@0 108 end
rmeddis@0 109 end
rmeddis@0 110
rmeddis@0 111 if printReportGuide.showTracks
rmeddis@0 112 % NB this procedure can only be used if all the tracks are present and
rmeddis@0 113 % of equal length
rmeddis@0 114 bigTable=[]; header=[];
rmeddis@0 115 disp(' '); disp('Leveltracks starting from 1 response before the first reversal')
rmeddis@0 116 for i=1:length(betweenRuns.levelTracks)
rmeddis@0 117 if printReportGuide.HorizontalTracks
rmeddis@0 118 printTabTable(betweenRuns.levelTracks{i});
rmeddis@0 119 end
rmeddis@0 120 header=strvcat(header, 'level');
rmeddis@0 121 end
rmeddis@0 122
rmeddis@0 123 disp(' '); disp('Response tracks starting from 1 response before the first reversal')
rmeddis@0 124 for i=1:length(betweenRuns.responseTracks)
rmeddis@0 125 if printReportGuide.HorizontalTracks
rmeddis@0 126 printTabTable(betweenRuns.responseTracks{i});
rmeddis@0 127 end
rmeddis@0 128 header=strvcat(header, 'resp');
rmeddis@0 129 end
rmeddis@0 130
rmeddis@0 131 disp(' '); disp('threshold tracks starting from the first reversal')
rmeddis@0 132 for i=1:length(betweenRuns.bestThresholdTracks)
rmeddis@0 133 if printReportGuide.HorizontalTracks
rmeddis@0 134 end
rmeddis@0 135 printTabTable(betweenRuns.bestThresholdTracks{i});
rmeddis@0 136 header=strvcat(header, 'mean');
rmeddis@0 137 end
rmeddis@0 138
rmeddis@0 139 disp(' '); disp('threshold (mean) tracks starting from the first reversal')
rmeddis@0 140 for i=1:length(betweenRuns.bestThresholdTracks)
rmeddis@0 141 if printReportGuide.HorizontalTracks
rmeddis@0 142 end
rmeddis@0 143 printTabTable(betweenRuns.bestThresholdMeanTracks{i});
rmeddis@0 144 header=strvcat(header, 'mean');
rmeddis@0 145 end
rmeddis@0 146 disp(' '); disp('threshold tracks (median) starting from the first reversal')
rmeddis@0 147 for i=1:length(betweenRuns.bestThresholdMedianTracks)
rmeddis@0 148 if printReportGuide.HorizontalTracks
rmeddis@0 149 end
rmeddis@0 150 printTabTable(betweenRuns.bestThresholdTracks{i});
rmeddis@0 151 header=strvcat(header, 'mean');
rmeddis@0 152 end
rmeddis@0 153
rmeddis@0 154 end
rmeddis@0 155
rmeddis@0 156 switch experiment.ear
rmeddis@0 157 case {'MAPmodelMultiCh', 'MAPmodelSingleCh'}
rmeddis@0 158 % show all parameters but do not compute the model
rmeddis@0 159 nm=UTIL_paramsList(whos);
rmeddis@0 160 for i=1:length(nm)
rmeddis@0 161 try
rmeddis@0 162 eval(['UTIL_showStruct(' nm{i} ', ''' nm{i} ''')'])
rmeddis@0 163 catch
rmeddis@0 164 end
rmeddis@0 165 end
rmeddis@0 166 end
rmeddis@0 167
rmeddis@0 168 if experiment.saveData
rmeddis@0 169 fprintf('\n')
rmeddis@0 170 disp('To reprint this report with tracks use:')
rmeddis@0 171 disp([ 'printReport(''' saveFileName ''',1)'])
rmeddis@0 172 end
rmeddis@0 173
rmeddis@0 174 % print final summary (repeat of above)
rmeddis@0 175 fprintf('\n')
rmeddis@0 176 fprintf('\n')
rmeddis@0 177 disp('thresholds')
rmeddis@0 178 msg=printTabTable(sortTablesForPrinting(idx1,idx2,var1values,var2values, betweenRuns.thresholds), headers);
rmeddis@0 179 addToMsg(msg,0)
rmeddis@0 180 fprintf('\n')
rmeddis@0 181
rmeddis@0 182 if length(var1values)==1 && length(var2values)==1 && experiment.maxTrials>49
rmeddis@0 183 [psy, levelsBinVector, binFrequencies, nNo, nYes]= ...
rmeddis@0 184 psychometricFunction(withinRuns.levelsPhaseTwo,withinRuns.responsesPhaseTwo, experiment.psyBinWidth);
rmeddis@0 185 disp('Psychometric function')
rmeddis@0 186 fprintf(' level \tfreq\tprob\n')
rmeddis@0 187 fprintf('%6.0f\t%6.2f\t%6.0f\n', [levelsBinVector; binFrequencies; psy])
rmeddis@0 188 fprintf('\n')
rmeddis@0 189 fprintf('k \t %6.2f\n',logistic.bestK)
rmeddis@0 190 fprintf('g \t%7.5f\n',rareEvent.bestGain)
rmeddis@0 191 fprintf('\n')
rmeddis@0 192
rmeddis@0 193 end
rmeddis@0 194 % resultsSoFar=[betweenRuns.var1Sequence(betweenRuns.runNumber)'...
rmeddis@0 195 % betweenRuns.var2Sequence(betweenRuns.runNumber)'...
rmeddis@0 196 % betweenRuns.thresholds(betweenRuns.runNumber)' ];
rmeddis@0 197 % fprintf('%10.3f \t%10.3f \t%10.1f \n', resultsSoFar')
rmeddis@0 198
rmeddis@0 199 % ------------------------------------------------------- sortTablesForPrinting
rmeddis@0 200 function table= sortTablesForPrinting(idx1,idx2, var1values,var2values, x)
rmeddis@0 201 % table converts a vector to a table
rmeddis@0 202 % after sorting according to idx1 and idx2
rmeddis@0 203 % the table is completed by adding row and column values
rmeddis@0 204 x=x(idx1);
rmeddis@0 205 x=x(idx2);
rmeddis@0 206 xMatrix=reshape(x,length(var1values),length(var2values));
rmeddis@0 207
rmeddis@0 208 table=[[-1000 var2values]; [var1values' xMatrix]];
rmeddis@0 209
rmeddis@0 210 % ------------------------------------------------------- showStructureSummary
rmeddis@0 211 function showStructureSummary(structure, name, maxNoArrayValues)
rmeddis@0 212 % showStructureSummary prints out the values of a single structure
rmeddis@0 213 % The header is the structure name and each row is a field
rmeddis@0 214 % e.g. showStructureSummary(params,'params')
rmeddis@0 215 % This not the same as 'UTIL_showstruct'
rmeddis@0 216
rmeddis@0 217
rmeddis@0 218 if nargin<3
rmeddis@0 219 maxNoArrayValues=20;
rmeddis@0 220 end
rmeddis@0 221
rmeddis@0 222 fprintf('\n%s:', name)
rmeddis@0 223
rmeddis@0 224 fields=fieldnames(eval('structure'));
rmeddis@0 225 % for each field in the structure
rmeddis@0 226 for i=1:length(fields)
rmeddis@0 227 y=eval([ 'structure.' fields{i}]);
rmeddis@0 228 if isstr(y),
rmeddis@0 229 % strings
rmeddis@0 230 fprintf('\n%s=\t''%s''', fields{i},y)
rmeddis@0 231 elseif isnumeric(y)
rmeddis@0 232 % arrays
rmeddis@0 233 if length(y)>1
rmeddis@0 234 % vectors
rmeddis@0 235 [r c]=size(y);
rmeddis@0 236 if r>c, y=y'; end
rmeddis@0 237
rmeddis@0 238 [r c]=size(y);
rmeddis@0 239 if r>1
rmeddis@0 240 % fprintf('\n%s.%s=\t%g x %g matrix',name, fields{i}, r, c)
rmeddis@0 241 fprintf('\n%s=\t%g x %g matrix',fields{i}, r, c)
rmeddis@0 242
rmeddis@0 243 elseif c<maxNoArrayValues
rmeddis@0 244 % fprintf('\n%s=\t[%s]', fields{i},num2str(y))
rmeddis@0 245 fprintf('\n%s=', fields{i})
rmeddis@0 246 fprintf('\t%g',y)
rmeddis@0 247
rmeddis@0 248 else
rmeddis@0 249 fprintf('\n%s=\t %g... [%g element array]', fields{i}, y(1),c)
rmeddis@0 250 end
rmeddis@0 251 else
rmeddis@0 252 % single valued arrays
rmeddis@0 253 % fprintf('\n%s.%s=\t%s;', name, fields{i},num2str(y))
rmeddis@0 254 fprintf('\n%s=\t%s', fields{i},num2str(y))
rmeddis@0 255 end
rmeddis@0 256 elseif iscell(y)
rmeddis@0 257 fprintf('\n%s=\t cell array', fields{i})
rmeddis@0 258
rmeddis@0 259 elseif isstruct(y)
rmeddis@0 260 fprintf('\n%s=\t structure', fields{i})
rmeddis@0 261 end,
rmeddis@0 262
rmeddis@0 263 end,
rmeddis@0 264 fprintf('\n')
rmeddis@0 265
rmeddis@0 266
rmeddis@0 267 % ------------------------------------------------------- printTabTable
rmeddis@0 268 function strings= printTabTable(M, headers)
rmeddis@0 269 % printTabTable prints a matrix as a table with tabs
rmeddis@0 270 %headers are optional
rmeddis@0 271 %headers=strvcat('firstname', 'secondname')
rmeddis@0 272 % printTabTable([1 2; 3 4],strvcat('a1','a2'));
rmeddis@0 273 stringCount=1; strings{stringCount}=[];
rmeddis@0 274
rmeddis@0 275 if nargin>1
rmeddis@0 276 [r c]=size(headers);
rmeddis@0 277 for no=1:r
rmeddis@0 278 % print all headers in a row
rmeddis@0 279 fprintf('%s\t',headers(no,:))
rmeddis@0 280 strings{stringCount}=sprintf('%s\t',headers(no,:)); stringCount=stringCount+1;
rmeddis@0 281 end
rmeddis@0 282 fprintf('\n')
rmeddis@0 283 end
rmeddis@0 284
rmeddis@0 285 [r c]=size(M);
rmeddis@0 286
rmeddis@0 287 for row=1:r
rmeddis@0 288 string=[];
rmeddis@0 289 for col=1:c
rmeddis@0 290 if row==1 & col==1 & M(1,1)==-1000
rmeddis@0 291 % Print nothing (tab follows below)
rmeddis@0 292 else
rmeddis@0 293 fprintf('%s',num2str(M(row,col)))
rmeddis@0 294 string=[string ' ' sprintf('%s',num2str(M(row,col)))];
rmeddis@0 295 end
rmeddis@0 296 if col<c
rmeddis@0 297 fprintf('\t')
rmeddis@0 298 % strings{stringCount}=sprintf('\t'); stringCount=stringCount+1;
rmeddis@0 299 end
rmeddis@0 300 end % col
rmeddis@0 301 strings{stringCount}=string; stringCount=stringCount+1;
rmeddis@0 302 fprintf('\n')
rmeddis@0 303 end % row
rmeddis@0 304
rmeddis@0 305 % ------------------------------------------------------- sortVariables
rmeddis@0 306 function [idx1, idx2, var1values, var2values]= ...
rmeddis@0 307 sortVariables(var1values, var2values, var1Sequence, var2Sequence)
rmeddis@0 308
rmeddis@0 309 [x idx1]= sort(var1Sequence);
rmeddis@0 310 var1Sequence= x;
rmeddis@0 311 var2Sequence= var2Sequence(idx1);
rmeddis@0 312 depVarName= 'th';
rmeddis@0 313
rmeddis@0 314 [x idx2]=sort(var2Sequence);
rmeddis@0 315 var2Sequence=x;
rmeddis@0 316 var1Sequence=var1Sequence(idx2);
rmeddis@0 317
rmeddis@0 318 var1values=sort(var1values);
rmeddis@0 319 var2values=sort(var2values);