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);
|