Switch to side-by-side view

--- a
+++ b/manuscript_material/c_Figure3_convergProfile.m
@@ -0,0 +1,182 @@
+%-------------------------------------------------------------------------%
+% 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, May 2015                                    %
+%    email:    l.modenese@imperial.ac.uk                                  % 
+% ----------------------------------------------------------------------- %
+%
+% This script reads the results of the sensitivity study of both examples
+% and generates Figure 3 - convergence profiles -. 
+% The figure is store in folder "Figure 3".
+
+clear;clc; close all
+% adds functions to load the datasets (removed at the end of the scritpt)
+addpath(genpath('./Functions_MusOptTool'))
+
+%============================== SETTINGS ==================================
+% points considered in the sensitivity
+n_eval_point_set = 5:1:15;
+% folder where the figure will be saved
+Fig_folder = './Figure 3';
+%==========================================================================
+
+
+
+%======== EXTRACTING RESULTS =========
+% nr of sensitivity checks
+N_sensit_checks = length(n_eval_point_set);
+
+% creating figure with nice proportion
+figure('Position', [ 131 114 1761 684]);
+
+% indeces to update the subplots
+n_plot_add = 0;
+
+% looping through the examples
+for n_ex = 1:2
+    
+    % updating results folder
+    results_folder          = ['./Example',num2str(n_ex),'/Results'];
+    
+    % index of n evaluation (one run of the tool in the sensitivity)
+    n_eval_ind = 1;
+    
+    % looping throught the evaluation points n
+    for n_eval = n_eval_point_set
+        
+        % loading the muscle map assessment file
+        load(fullfile(results_folder,['Results_MusMapMetrics_N',num2str(n_eval),'_NError10.mat']));
+        % creating a structure that summarise sensitivity results
+        SensitMusMapResults.RMSE(:,n_eval_ind) = Results_MusMapMetrics.RMSE;
+        
+        % loading muscle parameters from optimized models
+        load(fullfile(results_folder,['Results_MusVarMetrics_N',num2str(n_eval),'.mat']));
+        % creating a structure that summarise muscle parameters sensitivity results
+        SensitMusVarResults.Lopt_opt(:,n_eval_ind) = Results_MusVarMetrics.Lopt_opt;
+        SensitMusVarResults.Lts_opt(:,n_eval_ind) = Results_MusVarMetrics.Lts_opt;
+        
+        % update index
+        n_eval_ind = n_eval_ind+1;
+    end
+    
+    % calculating variations from previous evaluation in the sensitivity
+    % analysis
+    var_perc_Lopt = abs(diff(SensitMusVarResults.Lopt_opt, 1, 2));
+    var_perc_Lts = abs(diff(SensitMusVarResults.Lts_opt, 1, 2));
+    var_perc_RMSE = abs(diff(SensitMusMapResults.RMSE, 1, 2));
+    
+    for n = 1:size(var_perc_Lopt, 2)
+        % percentage variation with respect to previous evaluation
+        % calculate like: perc_var = 100*[Lopt(n+1)-Lopt(n)/Lopt(n)]
+        perc_var_Lopt(:,n) = 100*var_perc_Lopt(:,n)./SensitMusVarResults.Lopt_opt(:,n); %#ok<*SAGROW>
+        perc_var_Lts(:,n) = 100*var_perc_Lts(:,n)./SensitMusVarResults.Lts_opt(:,n);
+        perc_var_RMSE(:,n) = 100*var_perc_RMSE(:,n)./SensitMusMapResults.RMSE(:,n);
+    end
+    
+    %============== GENERATING THE FIGURE =================
+    for n = 1:size(perc_var_Lopt,1)
+        % plotting Lopt
+        subplot(2,3,1+n_plot_add)
+        Lopt_values_at_current_Neval = perc_var_Lopt(n, 1:end);
+        plot(n_eval_point_set(2:end), Lopt_values_at_current_Neval,'k'); hold on
+        xlim([6 15])
+        
+        % plotting Lts
+        subplot(2,3,2+n_plot_add)
+        Lts_values_at_current_Neval = perc_var_Lts(n, 1:end);
+        plot(n_eval_point_set(2:end), Lts_values_at_current_Neval,'k'); hold on
+        xlim([6 15])
+        
+        % plotting RMSE
+        subplot(2,3,3+n_plot_add)
+        RMSE_values_at_current_Neval = perc_var_RMSE(n, 1:end);
+        plot(n_eval_point_set(2:end), RMSE_values_at_current_Neval,'k'); hold on
+        xlim([6 15])
+        ylim([0 5])
+    end
+    
+    clear SensitMusMapResults SensitMusVarResults perc_var_Lopt perc_var_Lts perc_var_RMSE
+    
+    % updating plots for second row
+    n_plot_add = n_plot_add + 3;
+end
+
+%============ FINALIZING SUBPLOTS ============
+subplot(2,3,1)
+title('Optimal fiber length','FontWeight','bold','FontName','Arial','FontSize',12);
+ylabel({'Example 1';'';'Variation from previous iteration [%]';''},'FontWeight','bold','FontName','Arial','FontSize',12);
+ylim([0 1])
+
+subplot(2,3,2)
+title('Tendon slack length','FontWeight','bold','FontName','Arial','FontSize',12);
+ylim([0 0.2])
+
+subplot(2,3,3)
+title('RMSE','FontWeight','bold','FontName','Arial','FontSize',12);
+ylim([0 7])
+
+subplot(2,3,4)
+ylabel({'Example 2';'';'Variation from previous iteration [%]';''},'FontWeight','bold','FontName','Arial','FontSize',12);
+xlabel('Evaluation points per dof','FontWeight','bold','FontName','Arial','FontSize',12);
+ylim([0 4])
+
+subplot(2,3,5)
+xlabel('Evaluation points per dof','FontWeight','bold','FontName','Arial','FontSize',12);
+ylim([0 7])
+
+subplot(2,3,6)
+xlabel('Evaluation points per dof','FontWeight','bold','FontName','Arial','FontSize',12);
+ylim([0 5])
+
+
+% Create textarrow
+annotation(gcf,'textarrow',[0.204391891891892 0.185810810810811],...
+    [0.773696707105719 0.736568457538995],'TextEdgeColor','none',...
+    'String',{'semimbranosus'});
+
+% Create textarrow
+annotation(gcf,'textarrow',[0.509290540540541 0.495777027027027],...
+    [0.361218370883882 0.325823223570191],'TextEdgeColor','none',...
+    'String',{'gluteus max 2'});
+
+
+% % Create textarrow
+% annotation(gcf,'textarrow',[0.809199318568995 0.796138557637706],...
+%     [0.206602339181287 0.179824561403509],'TextEdgeColor','none',...
+%     'String',{'semimbranosus'});
+
+% Create textarrow
+annotation(gcf,'textarrow',[0.8125 0.759290540540541],...
+    [0.302292894280763 0.275563258232236],'TextEdgeColor','none',...
+    'String',{' psoas'});
+
+% Create arrow
+annotation(gcf,'arrow',[0.83702441794435 0.896081771720613],...
+    [0.298707602339181 0.273391812865497]);
+
+%============ PRINT FIGURES ============
+% checking on the figure folder
+checkFolder(Fig_folder)
+% printing figure
+set(gcf, 'PaperPositionMode','auto')     
+saveas(gcf,fullfile(Fig_folder,'Fig3_convergence_profile.fig'))
+saveas(gcf,fullfile(Fig_folder,'Fig3_convergence_profile.eps'))
+saveas(gcf,fullfile(Fig_folder,'Fig3_convergence_profile.png'))
+display( '===============================')
+display(['Figure 3 printed in ', Fig_folder]);
+display( '===============================')
+% close all
+
+% remove functions from path
+addpath(genpath('./Functions_MusOptTool'))
\ No newline at end of file