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@32: global experiment stimulusParameters betweenRuns withinRuns statsModel rmeddis@0: global LevittControl expGUIhandles rmeddis@29: global paramChanges rmeddis@0: rmeddis@32: % NB all globals are used even though this is not obvious 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: printReportGuide.structures=1; rmeddis@0: printReportGuide.showPsychometric=0; rmeddis@0: printReportGuide.HorizontalTracks=1; rmeddis@0: rmeddis@38: rmeddis@0: if nargin==0 rmeddis@0: % print new report rmeddis@0: printReportGuide.showTracks=experiment.printTracks; rmeddis@0: printReportGuide.fileName=[]; rmeddis@33: % save this data (just in case) rmeddis@33: saveFileName=['savedData/mostRecentResults']; rmeddis@0: experiment.minElapsed=etime(clock, betweenRuns.timeNow)/60; rmeddis@20: save(saveFileName, 'experiment', 'stimulusParameters',... rmeddis@20: 'betweenRuns', 'withinRuns', 'statsModel', 'expGUIhandles') rmeddis@0: disp(['data saved as: ' saveFileName]); rmeddis@32: rmeddis@0: else rmeddis@20: % reprint request (i.e print out old data) 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@20: 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@20: 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: 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@20: % first sort the actual sequence into a more readable sequence rmeddis@0: [idx1, idx2, var1values, var2values]=... rmeddis@20: sortVariables(betweenRuns.variableList1, betweenRuns.variableList2,... rmeddis@20: betweenRuns.var1Sequence, betweenRuns.var2Sequence); rmeddis@0: 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@28: global resultsTable rmeddis@28: resultsTable= sortTablesForPrinting(idx1,idx2,... rmeddis@28: var1values,var2values, betweenRuns.thresholds); rmeddis@28: msg=printTabTable(resultsTable, headers); rmeddis@0: addToMsg(msg,0) rmeddis@32: if ~isempty(paramChanges) rmeddis@32: fprintf('\n') rmeddis@33: fprintf('%s\n', char(paramChanges)) rmeddis@32: end 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: 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@32: showStructureSummary(stimulusParameters, 'stimulusParameters', ... rmeddis@32: maxNoArrayValues) rmeddis@0: showStructureSummary(experiment, 'experiment',maxNoArrayValues) rmeddis@0: showStructureSummary(betweenRuns, 'betweenRuns',maxNoArrayValues) rmeddis@0: showStructureSummary(withinRuns, 'withinRuns') rmeddis@32: rmeddis@0: switch experiment.threshEstMethod rmeddis@0: case {'2I2AFC++', '2I2AFC+++'} rmeddis@32: showStructureSummary(LevittControl, 'LevittControl', ... rmeddis@32: maxNoArrayValues) rmeddis@0: end rmeddis@32: rmeddis@0: switch experiment.ear rmeddis@0: case {'statsModelLogistic','statsModelRareEvent'} rmeddis@32: showStructureSummary(statsModel, 'statsModel', ... rmeddis@32: 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@32: disp(' '); rmeddis@32: 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@32: rmeddis@32: disp(' '); rmeddis@32: disp('Response tracks 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@32: 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@32: 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@32: msg=printTabTable(sortTablesForPrinting... rmeddis@32: (idx1,idx2,var1values,var2values, betweenRuns.thresholds), headers); rmeddis@0: addToMsg(msg,0) rmeddis@0: fprintf('\n') rmeddis@0: rmeddis@32: if length(var1values)==1 && length(var2values)==1 ... rmeddis@32: && experiment.maxTrials>49 rmeddis@32: [psy, levelsBinVector, binFrequencies]= ... rmeddis@32: psychometricFunction(withinRuns.levelsPhaseTwo,... rmeddis@32: withinRuns.responsesPhaseTwo, experiment.psyBinWidth); rmeddis@0: disp('Psychometric function') rmeddis@0: fprintf(' level \tfreq\tprob\n') rmeddis@32: fprintf('%6.0f\t%6.2f\t%6.0f\n',[levelsBinVector; binFrequencies; psy]) rmeddis@38: rmeddis@38: switch experiment.threshEstMethod rmeddis@38: % only one value required for level change rmeddis@38: case {'MaxLikelihood', 'oneIntervalUpDown'}; rmeddis@38: % fprintf('\n') rmeddis@38: % fprintf('k \t %6.2f\n',logistic.bestK) rmeddis@38: % fprintf('g \t%7.5f\n',rareEvent.bestGain) rmeddis@38: end rmeddis@0: fprintf('\n') rmeddis@32: rmeddis@0: end rmeddis@9: rmeddis@9: fprintf('\nparadigm:\t%s\n ', experiment.paradigm) rmeddis@32: if ~isempty(paramChanges) rmeddis@33: fprintf('%s\n', char(paramChanges)) rmeddis@32: end rmeddis@0: rmeddis@32: % ------------------------------------------------- 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@32: % --------------------------------------------------- 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@32: rmeddis@0: [r c]=size(y); rmeddis@0: if r>1 rmeddis@32: % 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@32: 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@32: strings{stringCount}=... rmeddis@32: 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@32: 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