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