Skip to main content

calcMuscleTendonLengthInitializationCost.m


% This function is part of the NMSM Pipeline, see file for full license.
%
% (Array of number, struct, struct, struct) -> (Array of number)
% returns the total cost for the MuscleTendonLengthInitialization optimization


function totalCost = calcMuscleTendonLengthInitializationCost(values, ...
modeledValues, experimentalData)
totalCost = 0;
costTerms = experimentalData.costTerms;
for i = 1:length(costTerms)
costTerm = costTerms{i};
if costTerm.isEnabled
switch costTerm.type
case "passive_joint_moment"
if isfield(experimentalData, "passiveData")
cost = calcPassiveMomentTrackingCost(modeledValues, ...
experimentalData, costTerm);
else
throw(MException("", "Cannot use passive_joint_moment cost function type without passive data"))
end
case "optimal_muscle_fiber_length"
cost = calcOptimalFiberLengthScaleFactorDeviationCost(values, ...
costTerm);
case "tendon_slack_length"
cost = calcTendonSlackLengthScaleFactorDeviationCost(values, ...
costTerm);
case "minimum_normalized_muscle_fiber_length"
cost = calcMinimumNormalizedFiberLengthDeviationCost(modeledValues, ...
experimentalData, costTerm);
case "maximum_normalized_muscle_fiber_length"
cost = calcMaximumNormalizedFiberLengthDeviationCost(modeledValues, ...
values, experimentalData, costTerm);
case "maximum_muscle_stress"
cost = calcMaximumMuscleStressPenaltyCost(values, costTerm);
case "passive_muscle_force"
cost = calcPassiveForcePenaltyCost(modeledValues, costTerm);
case "grouped_normalized_muscle_fiber_length"
cost = calcNormalizedFiberLengthMeanSimilarityCost(modeledValues, ...
experimentalData, costTerm);
case "grouped_maximum_normalized_muscle_fiber_length"
cost = calcMaximumNormalizedFiberLengthSimilarityCost(values, ...
experimentalData, costTerm);
otherwise
throw(MException("", "Cost term " + type + " is not valid for Muscle Tendon Length Initialization"))
end
totalCost = cat(1, totalCost, cost);
end
end