--- a
+++ b/MATLAB_tool/MuscleParOptTool/private/getJointsSpannedByMuscle.m
@@ -0,0 +1,135 @@
+%-------------------------------------------------------------------------%
+% Copyright (c) 2015 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, July 2013                                   %
+%    email:    l.modenese@imperial.ac.uk                                  % 
+% ----------------------------------------------------------------------- %
+%
+% Given as INPUT a muscle OSMuscleName from an OpenSim model, this function
+% returns the OUTPUT structure jointNameSet containing the OpenSim jointNames
+% crossed by the OSMuscle.
+%
+% It works through the following steps:
+%   1) extracts the GeometryPath
+%   2) loops through the single points, determining the body they belong to
+%   3) stores the bodies to which the muscle points are attached to
+%   4) determines the nr of joints based on body indexes
+%   5) stores the crossed OpenSim joints in the output structure named jointNameSet
+%
+% NB this function return the crossed joints independently on the
+% constraints applied to the coordinates. Eg patello-femoral is considered as a
+% joint, although in Arnold's model it does not have independent
+% coordinates, but it is moved in dependency of the knee flexion angle.
+
+
+function [jointNameSet,varargout] = getJointsSpannedByMuscle(osimModel, OSMuscleName)
+
+% just in case the OSMuscleName is given as java string
+OSMuscleName = char(OSMuscleName);
+
+%useful initializations
+BodySet = osimModel.getBodySet();
+muscle  = osimModel.getMuscles.get(OSMuscleName);
+
+% additions BAK
+% load a jointStrucute detailing bone and joint configurations
+jointStructure = getModelJointDefinitions(osimModel);
+
+% Extracting the PathPointSet via GeometryPath
+musclePath = muscle.getGeometryPath();
+musclePathPointSet = musclePath.getPathPointSet();
+
+% for loops to get the attachment bodies
+n_body = 1;
+jointNameSet = [];
+muscleAttachBodies = '';
+muscleAttachIndex = [];
+for n_point = 0:musclePathPointSet.getSize()-1
+    
+    % get the current muscle point
+    currentAttachBody = char(musclePathPointSet.get(n_point).getBodyName());
+    
+    %Initialize
+    if n_point ==0
+        previousAttachBody = currentAttachBody;
+        muscleAttachBodies{n_body} = currentAttachBody;
+        muscleAttachIndex(n_body) = BodySet.getIndex(currentAttachBody);
+        n_body = n_body+1;
+    end
+    
+    % building a vectors of the bodies attached to the muscles
+    if ~strncmp(currentAttachBody,previousAttachBody, size(char(currentAttachBody),2))
+        muscleAttachBodies{n_body} = currentAttachBody;
+        muscleAttachIndex(n_body) = BodySet.getIndex(currentAttachBody);
+        previousAttachBody = currentAttachBody;
+        n_body = n_body+1;
+    end
+end
+
+% From distal body checking the joint names going up until the desired
+% OSJointName is found or the proximal body is reached as parent body.
+DistalBodyName = muscleAttachBodies{end};
+bodyName = DistalBodyName;
+ProximalBodyName= muscleAttachBodies{1};
+body =  BodySet.get(DistalBodyName);
+spannedJointNameOld = '';
+n_spanJoint = 1;
+n_spanJointNoDof = 1;
+NoDofjointNameSet = {};
+jointNameSet = {};
+while ~strcmp(bodyName,ProximalBodyName)
+    
+    %spannedJoint = body.getJoint();
+    %spannedJointName = char(spannedJoint.getName());
+    
+    % BAK implementation
+    spannedJointName = getChildBodyJoint(jointStructure, body.getName());
+    spannedJoint = osimModel.getJointSet().get(spannedJointName);
+   
+    if strcmp(spannedJointName, spannedJointNameOld)
+         %body =  spannedJoint.getParentBody();
+         % BAK implementation
+         body = jointStructure.spannedJoint.parentBody;
+         
+         spannedJointNameOld = spannedJointName;
+    else
+            %if spannedJoint.getCoordinateSet().getSize()~=0
+            if spannedJoint.numCoordinates()~=0
+        jointNameSet{n_spanJoint} =  spannedJointName;
+        n_spanJoint = n_spanJoint+1;
+            else
+                NoDofjointNameSet{n_spanJointNoDof} =  spannedJointName;
+                n_spanJointNoDof = n_spanJointNoDof+1;
+            end
+        spannedJointNameOld = spannedJointName;
+        %body =  spannedJoint.getParentBody();
+        bodyName = jointStructure.(char(spannedJointName)).parentBody;
+        body = osimModel.getBodySet().get(bodyName);
+        
+    end
+    bodyName = body.getName();
+    
+end
+
+if isempty(jointNameSet)
+    error(['No joint detected for muscle ',OSMuscleName]);
+end
+if  ~isempty(NoDofjointNameSet)
+    for n_v = 1:length(NoDofjointNameSet)
+        display(['Joint ',NoDofjointNameSet{n_v},' has no dof.'])
+    end
+end
+
+varargout = NoDofjointNameSet;
+end
\ No newline at end of file