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