Mercurial > hg > map
diff Copy_of_multithreshold 1.46/printReport.m @ 28:02aa9826efe0
mainly multiThreshold
author | Ray Meddis <rmeddis@essex.ac.uk> |
---|---|
date | Fri, 01 Jul 2011 12:59:47 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Copy_of_multithreshold 1.46/printReport.m Fri Jul 01 12:59:47 2011 +0100 @@ -0,0 +1,303 @@ +function printReport(fileName, printTracks) + +% End of run report (no args) +% *or* +% reprint previous report from file + +global experiment stimulusParameters betweenRuns withinRuns statsModel audio +global LevittControl expGUIhandles + + +global inputStimulusParams OMEParams DRNLParams +global IHC_VResp_VivoParams IHCpreSynapseParams AN_IHCsynapseParams +global MacGregorParams MacGregorMultiParams filteredSACFParams +global experiment % used by calls from multiThreshold only +global IHC_cilia_RPParams + + +printReportGuide.structures=1; +printReportGuide.showPsychometric=0; +printReportGuide.HorizontalTracks=1; + +if nargin==0 + % print new report + printReportGuide.showTracks=experiment.printTracks; + printReportGuide.fileName=[]; + if experiment.saveData + saveFileName=['savedData/' experiment.name '_' experiment.date '_' experiment.paradigm]; + else + % save this data (just in case) + saveFileName=['savedData/mostRecentResults']; + end + experiment.minElapsed=etime(clock, betweenRuns.timeNow)/60; + save(saveFileName, 'experiment', 'stimulusParameters',... + 'betweenRuns', 'withinRuns', 'statsModel', 'expGUIhandles') + disp(['data saved as: ' saveFileName]); + +else + % reprint request (i.e print out old data) + printReportGuide.fileName=fileName; + load(printReportGuide.fileName) + saveFileName=printReportGuide.fileName; + if nargin>1 + printReportGuide.showTracks=printTracks; + else + printReportGuide.showTracks=experiment.printTracks; + end +end + +fprintf('******** multithreshold ') + +x=pwd; disp(['version ' x(end-3:end)]) +fprintf('\nName:\t%s ', experiment.name) +fprintf('\nparadigm:\t%s ', experiment.paradigm) +fprintf('\nEar:\t%s ', experiment.ear) + +method=experiment.threshEstMethod; +if stimulusParameters.includeCue && ~strcmp(method(1:6),'2I2AFC') + method=[method '/ withCue']; +end +fprintf('\nmethod:\t%s ', method) +fprintf('\ndate:\t%s ', experiment.date) +fprintf('\n\n') + +if isempty(betweenRuns.thresholds) + disp('no thresholds found') +end + +% prepare results as matrices ready to print +% first sort the actual sequence into a more readable sequence +[idx1, idx2, var1values, var2values]=... + sortVariables(betweenRuns.variableList1, betweenRuns.variableList2,... + betweenRuns.var1Sequence, betweenRuns.var2Sequence); + +header1=betweenRuns.variableName1; +header2=betweenRuns.variableName2; +header1 = strrep(header1, 'none', ' '); % none is not a useful header +header2 = strrep(header2, 'none', ' '); % none is not a useful header +headers=strvcat([header1 '/'], header2); + +disp('thresholds') +msg=printTabTable(sortTablesForPrinting(idx1,idx2,... + var1values,var2values, betweenRuns.thresholds), headers); +addToMsg(msg,0) +fprintf('\n') + +% sort tracks into the same order +betweenRuns.levelTracks=betweenRuns.levelTracks(idx1); +betweenRuns.responseTracks=betweenRuns.responseTracks(idx1); +betweenRuns.bestThresholdTracks=betweenRuns.bestThresholdTracks(idx1); +betweenRuns.levelTracks=betweenRuns.levelTracks(idx2); +betweenRuns.responseTracks=betweenRuns.responseTracks(idx2); +betweenRuns.bestThresholdTracks=betweenRuns.bestThresholdTracks(idx2); + +if printReportGuide.structures + maxNoArrayValues=30; + showStructureSummary(stimulusParameters, 'stimulusParameters', maxNoArrayValues) + showStructureSummary(experiment, 'experiment',maxNoArrayValues) + showStructureSummary(betweenRuns, 'betweenRuns',maxNoArrayValues) + showStructureSummary(withinRuns, 'withinRuns') + + switch experiment.threshEstMethod + case {'2I2AFC++', '2I2AFC+++'} + showStructureSummary(LevittControl, 'LevittControl', maxNoArrayValues) + end + + switch experiment.ear + case {'statsModelLogistic','statsModelRareEvent'} + showStructureSummary(statsModel, 'statsModel', maxNoArrayValues) + end +end + +if printReportGuide.showTracks + % NB this procedure can only be used if all the tracks are present and + % of equal length + bigTable=[]; header=[]; + disp(' '); disp('Leveltracks starting from 1 response before the first reversal') + for i=1:length(betweenRuns.levelTracks) + if printReportGuide.HorizontalTracks + printTabTable(betweenRuns.levelTracks{i}); + end + header=strvcat(header, 'level'); + end + + disp(' '); disp('Response tracks starting from 1 response before the first reversal') + for i=1:length(betweenRuns.responseTracks) + if printReportGuide.HorizontalTracks + printTabTable(betweenRuns.responseTracks{i}); + end + header=strvcat(header, 'resp'); + end + + disp(' '); disp('threshold tracks starting from the first reversal') + for i=1:length(betweenRuns.bestThresholdTracks) + if printReportGuide.HorizontalTracks + end + printTabTable(betweenRuns.bestThresholdTracks{i}); + header=strvcat(header, 'mean'); + end + +end + +switch experiment.ear + case {'MAPmodelMultiCh', 'MAPmodelSingleCh'} + % show all parameters but do not compute the model + nm=UTIL_paramsList(whos); + for i=1:length(nm) + try + eval(['UTIL_showStruct(' nm{i} ', ''' nm{i} ''')']) + catch + end + end +end + +if experiment.saveData + fprintf('\n') + disp('To reprint this report with tracks use:') + disp([ 'printReport(''' saveFileName ''',1)']) +end + +% print final summary (repeat of above) +fprintf('\n') +fprintf('\n') +disp('thresholds') +msg=printTabTable(sortTablesForPrinting(idx1,idx2,var1values,var2values, betweenRuns.thresholds), headers); +addToMsg(msg,0) +fprintf('\n') + +if length(var1values)==1 && length(var2values)==1 && experiment.maxTrials>49 + [psy, levelsBinVector, binFrequencies, nNo, nYes]= ... + psychometricFunction(withinRuns.levelsPhaseTwo,withinRuns.responsesPhaseTwo, experiment.psyBinWidth); + disp('Psychometric function') + fprintf(' level \tfreq\tprob\n') + fprintf('%6.0f\t%6.2f\t%6.0f\n', [levelsBinVector; binFrequencies; psy]) + fprintf('\n') + fprintf('k \t %6.2f\n',logistic.bestK) + fprintf('g \t%7.5f\n',rareEvent.bestGain) + fprintf('\n') + +end + +fprintf('\nparadigm:\t%s\n ', experiment.paradigm) + +% ------------------------------------------------------- sortTablesForPrinting +function table= sortTablesForPrinting(idx1,idx2, var1values,var2values, x) +% table converts a vector to a table +% after sorting according to idx1 and idx2 +% the table is completed by adding row and column values +x=x(idx1); +x=x(idx2); +xMatrix=reshape(x,length(var1values),length(var2values)); + +table=[[-1000 var2values]; [var1values' xMatrix]]; + +% ------------------------------------------------------- showStructureSummary +function showStructureSummary(structure, name, maxNoArrayValues) +% showStructureSummary prints out the values of a single structure +% The header is the structure name and each row is a field +% e.g. showStructureSummary(params,'params') +% This not the same as 'UTIL_showstruct' + + +if nargin<3 + maxNoArrayValues=20; +end + +fprintf('\n%s:', name) + +fields=fieldnames(eval('structure')); +% for each field in the structure +for i=1:length(fields) + y=eval([ 'structure.' fields{i}]); + if isstr(y), + % strings + fprintf('\n%s=\t''%s''', fields{i},y) + elseif isnumeric(y) + % arrays + if length(y)>1 + % vectors + [r c]=size(y); + if r>c, y=y'; end + + [r c]=size(y); + if r>1 + % fprintf('\n%s.%s=\t%g x %g matrix',name, fields{i}, r, c) + fprintf('\n%s=\t%g x %g matrix',fields{i}, r, c) + + elseif c<maxNoArrayValues + % fprintf('\n%s=\t[%s]', fields{i},num2str(y)) + fprintf('\n%s=', fields{i}) + fprintf('\t%g',y) + + else + fprintf('\n%s=\t %g... [%g element array]', fields{i}, y(1),c) + end + else + % single valued arrays + % fprintf('\n%s.%s=\t%s;', name, fields{i},num2str(y)) + fprintf('\n%s=\t%s', fields{i},num2str(y)) + end + elseif iscell(y) + fprintf('\n%s=\t cell array', fields{i}) + + elseif isstruct(y) + fprintf('\n%s=\t structure', fields{i}) + end, + +end, +fprintf('\n') + + +% ------------------------------------------------------- printTabTable +function strings= printTabTable(M, headers) +% printTabTable prints a matrix as a table with tabs +%headers are optional +%headers=strvcat('firstname', 'secondname') +% printTabTable([1 2; 3 4],strvcat('a1','a2')); +stringCount=1; strings{stringCount}=[]; + +if nargin>1 + [r c]=size(headers); + for no=1:r + % print all headers in a row + fprintf('%s\t',headers(no,:)) + strings{stringCount}=sprintf('%s\t',headers(no,:)); stringCount=stringCount+1; + end + fprintf('\n') +end + +[r c]=size(M); + +for row=1:r + string=[]; + for col=1:c + if row==1 & col==1 & M(1,1)==-1000 + % Print nothing (tab follows below) + else + fprintf('%s',num2str(M(row,col))) + string=[string ' ' sprintf('%s',num2str(M(row,col)))]; + end + if col<c + fprintf('\t') + % strings{stringCount}=sprintf('\t'); stringCount=stringCount+1; + end + end % col + strings{stringCount}=string; stringCount=stringCount+1; + fprintf('\n') +end % row + +% ------------------------------------------------------- sortVariables +function [idx1, idx2, var1values, var2values]= ... + sortVariables(var1values, var2values, var1Sequence, var2Sequence) + +[x idx1]= sort(var1Sequence); +var1Sequence= x; +var2Sequence= var2Sequence(idx1); +depVarName= 'th'; + +[x idx2]=sort(var2Sequence); +var2Sequence=x; +var1Sequence=var1Sequence(idx2); + +var1values=sort(var1values); +var2values=sort(var2values);