Switch to side-by-side view

--- a
+++ b/manuscript_material/d_Figure4_assessResults.m
@@ -0,0 +1,189 @@
+%-------------------------------------------------------------------------%
+% Copyright (c) 2019 Modenese L., Ceseracciu, E., Reggiani M., Lloyd, D.G.%
+%                                                                         %
+% Licensed under the Apache License, Version 2.0 (the "License");         %
+% you may not use this file except in compliance with the License.        %
+% You may obtain a copy of the License at                                 %
+% http://www.apache.org/licenses/LICENSE-2.0.                             %
+%                                                                         % 
+% Unless required by applicable law or agreed to in writing, software     %
+% distributed under the License is distributed on an "AS IS" BASIS,       %
+% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or         %
+% implied. See the License for the specific language governing            %
+% permissions and limitations under the License.                          %
+%                                                                         %
+%    Author:   Luca Modenese, August 2014                                 %
+%    email:    l.modenese@imperial.ac.uk                                  % 
+% ----------------------------------------------------------------------- %
+%
+% This script reads the results of the sensitivity study of both examples
+% and generates Figure 4 -mapping results -. 
+% The figure is store in folder "Figure 4".
+
+clear; clc; close all
+
+% importing muscle optimizer's functions
+addpath(genpath('./Functions_MusOptTool'))
+
+%========= USERS SETTINGS =======
+% evaluations per dof
+N_eval = 10;
+% folder where the figure will be saved
+% NB: a log file is saved with the figure
+Fig_folder = './Figure 4';
+% angles of rotation for muscle names
+rot_angle = -90;
+%================================
+
+
+% check if figure folder exists
+checkFolder(Fig_folder);
+
+% subplot index
+plot_incr =0;
+
+% creating figure of nice proportions
+figure('Position',[1 41 1366  652])
+
+% clean log file
+fid = fopen([Fig_folder,'./Results_summary.txt'],'w');
+fclose all;
+% set diary
+diary([Fig_folder,'./Results_summary.txt'])
+
+for n_example = 1:2
+%====== EXAMPLES DETAILS ======== 
+% choosing folders and models for the desired example.
+switch n_example
+    case 1  
+        %========= EXAMPLE 1 =============
+        % string case identifier
+        case_id = 'Example1';
+        % reference model and its folder
+        osimModel_ref_file = 'Reference_Hamner_L.osim';
+        % target model and its folder
+        osimModel_targ_file = 'Target_Hamner_scaled_L.osim';
+    case 2
+        %=========== SUBJECT SPECIFIC MODEL =============
+        % string case identifier
+        case_id = 'Example2';
+        % reference model and its folder
+        osimModel_ref_file = 'Reference_Arnold_Rv2.osim';
+        % target model and its folder
+        osimModel_targ_file = 'Target_GenericFemale_WCB_Schuttev2.osim';
+    otherwise
+        error('Please choose an example between 1 and 2.');
+end
+
+%=========== INITIALIZING FOLDERS AND FILES =============
+% folders used by the script
+refModel_folder         = ['./',case_id,'/MSK_Models'];
+targModel_folder        = refModel_folder;
+OptimizedModel_folder   = ['./',case_id,'/OptimModels'];% folder for storing optimized model
+Results_folder          = ['./',case_id,'/Results'];
+
+% results file identified
+res_file_id_exp = ['_N',num2str(N_eval)];
+
+% load the results for the selected number of sampling points
+try
+    load(fullfile(Results_folder,['Results_MusVarMetrics',res_file_id_exp]));
+    load(fullfile(Results_folder,['Results_MusMapMetrics',res_file_id_exp,'_NError10']));
+catch err
+    display(err.message);
+end
+
+% % %===== PLOT OF RMSE AND MEAN TRACKING ERROR FOR EACH CASE SEPARATLY =======
+% % % plotting the RMSE and mean tracking errors (for descriptions in the
+% % % paper)
+% % figure('Position',[437 339 1140 600]);
+% % plotMusMappingMetrics(Results_MusMapMetrics);
+% % gcf, subplot(2,1,1); 
+% % title(['Example ',num2str(n_example)],'FontWeight','bold','FontName','Arial','FontSize',12);
+% % %==========================================================================
+
+% preparing muscle names
+n_mus = size(Results_MusMapMetrics.colheaders,2);
+musNames = strrep(Results_MusMapMetrics.colheaders,'_',' ');
+for r = 1:n_mus;
+    musNames{r} = [' ',musNames{r}(1:end-2)];
+end
+
+%=============== PLOTTING FIGURE ==================
+% first row subplots: RMSE error for the two examples
+h1 = subplot(2,2,1+plot_incr);
+bar(Results_MusMapMetrics.RMSE,'DisplayName','RMSE','FaceColor',[1,1,1],'EdgeColor',[0 0 0]);
+% adapt x ticks for better visibility
+xlim([0 n_mus+1])
+% include muscle names...
+set(gca,'xTick', (1:n_mus)+0.15,'xTickLabel', musNames,'TickLength',[0 0])%,'FontName','arial','FontSize',12)
+%..and rotate them
+rotateXLabels( h1, rot_angle)
+% finalize with y label and title
+ylabel('RMSE','FontWeight','bold','FontName','Arial','FontSize',12); 
+title({['Example',num2str(n_example)];' '},'FontWeight','bold','FontName','Arial','FontSize',14); 
+
+% second row presents mean tracking error and SD as error bar
+h2 = subplot(2,2,3+plot_incr);
+% bar plus error
+bar(Results_MusMapMetrics.MeanPercError,'DisplayName','Mean error [%]','FaceColor',[1,1,1],'EdgeColor',[0 0 0]);hold on
+errorbar(1:n_mus,  Results_MusMapMetrics.MeanPercError,...
+    Results_MusMapMetrics.StandDevPercError,'k.', 'MarkerSize',0.1);
+
+% setting up x axis and labels as above
+xlim([0 n_mus+1])
+set(gca,'xTick', (1:n_mus)+0.15,'xTickLabel', musNames,'TickLength',[0 0]);%,'FontName','arial','FontSize',6)
+rotateXLabels( h2, rot_angle)
+% finalize with y label
+ylabel('Mean error [%]','FontWeight','bold','FontName','Arial','FontSize',12); 
+% adjusting size
+if n_example == 1
+    ylim([0 4]);
+else
+    ylim([0 40]);
+end
+
+% update plot increm
+plot_incr = plot_incr+1;
+
+%==================== OTHER RESULTS (PRINTED AT SCREEN) ==================
+% save log
+diary('on')
+% display results
+display('=====================================')
+display(['MUSCLE PARAM VARIATIONS (EXAMPLE ',num2str(n_example),')'])
+display('=====================================')
+display(['Lopt variation [%] :  MIN:',num2str(Results_MusVarMetrics.Lopt_var_range(1)), '  (',Results_MusVarMetrics.Lopt_var_range_mus{1},')']);
+display(['                      MAX:',num2str(Results_MusVarMetrics.Lopt_var_range(2)), '  (',Results_MusVarMetrics.Lopt_var_range_mus{2},')']);
+display(['Lts variation [%]  :  MIN:',num2str(Results_MusVarMetrics.Lts_var_range(1)), '  (',Results_MusVarMetrics.Lts_var_range_mus{1},')']);
+display(['                      MAX:',num2str(Results_MusVarMetrics.Lts_var_range(2)), '  (',Results_MusVarMetrics.Lts_var_range_mus{2},')']);
+
+% results in terms of muscle parameters variations
+display('=====================================')
+display(['MUSCLE MAPPING METRICS (EXAMPLE ',num2str(n_example),')'])
+display('=====================================')
+display(['Range of RMSE       :  MIN:',num2str(Results_MusMapMetrics.RMSE_range(1)), '  (',Results_MusMapMetrics.RMSE_range_mus{1},')']);
+display(['                       MAX:',num2str(Results_MusMapMetrics.RMSE_range(2)), '  (',Results_MusMapMetrics.RMSE_range_mus{2},')']);
+display(['Range of MeanErr [%]:  MIN:',num2str(Results_MusMapMetrics.MeanPercError_range(1)), '  (',Results_MusMapMetrics.MeanPercError_range_mus{1},')']);
+display(['                       MAX:',num2str(Results_MusMapMetrics.MeanPercError_range(2)), '  (',Results_MusMapMetrics.MeanPercError_range_mus{2},')']);
+display(['Range of MaxErr [%] :  MIN:',num2str(Results_MusMapMetrics.MaxPercError_range(1)), '  (',Results_MusMapMetrics.MaxPercError_range_mus{1},')']);
+display(['                       MAX:',num2str(Results_MusMapMetrics.MaxPercError_range(2)), '  (',Results_MusMapMetrics.MaxPercError_range_mus{2},')']);
+display(['Range of corr coeff :  MIN:',num2str(Results_MusMapMetrics.rho_pval_range(1,1))])
+display(['                       MAX:',num2str(Results_MusMapMetrics.rho_pval_range(1,3))]);
+display(['Range of p val      :  MIN:',num2str(Results_MusMapMetrics.rho_pval_range(1,2))]);
+display(['                       MAX:',num2str(Results_MusMapMetrics.rho_pval_range(1,4))]);
+diary('off')
+end
+
+%============ PRINT FIGURES ============
+set(gcf, 'PaperPositionMode','auto')     
+saveas(gcf,fullfile(Fig_folder,'Fig4_TrackingResults.fig'))
+saveas(gcf,fullfile(Fig_folder,'Fig4_TrackingResults.eps'))
+saveas(gcf,fullfile(Fig_folder,'Fig4_TrackingResults.png'))
+display( '===============================')
+display(['Figure 4 printed in ', Fig_folder]);
+display( '===============================')
+% close all
+
+% removing functions
+rmpath(genpath('./Functions_MusOptTool'));