--- a
+++ b/Tools/AnyMocap/ScalingLengthMassFat_TrunkWidthScaling.any
@@ -0,0 +1,360 @@
+/* -------------------------------------------------------------------------------------------
+This file implements a scaling law based on segment length and mass. The y (length) direction
+of each segment is scaled according to Anthro joint center distances. The cross sectional
+directions, x and z, are scaled according to the segment mass, and so is the strength.
+
+John Rasmussen & Mark de Zee, 2004.11.23
+------------------------------------------------------------------------------------------- */
+
+AnyFolder Scaling = {
+  
+  #include "<ANYBODY_PATH_BODY>/BodyModels/GenericBodyModel/BodyModel.StandardParameters.any"
+  
+  AnyFolder MassScaling = {
+    AnyFolder Pelvis = { AnyVar MassScale = ..AnthroData.pelvis / ..StandardParameters.Pelvis.Mass; };
+    AnyFolder Head = { AnyVar MassScale = (..AnthroData.head) / (..StandardParameters.Head.Mass); };
+    AnyFolder Cervical = { AnyVar MassScale = .Head.MassScale;};
+    AnyFolder Trunk = { AnyVar MassScale = ( ..AnthroData.thorax) / (..StandardParameters.Trunk.Mass  ); }; //Ratio of mass of thorax plus lumbar mass
+    AnyFolder Lumbar = { AnyVar MassScale = (..AnthroData.lumbar) / (..StandardParameters.Lumbar.Mass); };//Ratio of mass of lumbar mass
+    AnyFolder Clavicula = { AnyVar MassScale = (..AnthroData.Shoulder_r ) / (..StandardParameters.Clavicula.Mass + ..StandardParameters.Scapula.Mass); };   
+    AnyFolder Scapula = { AnyVar MassScale = (..AnthroData.Shoulder_r ) / (..StandardParameters.Clavicula.Mass + ..StandardParameters.Scapula.Mass); };       
+    AnyFolder Humerus = { AnyVar MassScale = ..AnthroData.upper_arm_r / ..StandardParameters.Humerus.Mass; };
+    AnyFolder Ulna = { AnyVar MassScale = ..AnthroData.lower_arm_r / (2*..StandardParameters.Ulna.Mass); };
+    AnyFolder Radius = { AnyVar MassScale = ..AnthroData.lower_arm_r / (2*..StandardParameters.Ulna.Mass);  };
+    AnyFolder Hand = { AnyVar MassScale = ..AnthroData.hand_r / ..StandardParameters.Hand.Mass; };
+    
+    AnyFolder Right = 
+    {
+      AnyFolder Foot = { AnyVar MassScale = (...AnthroData.Right.foot + ...AnthroData.Right.ball) / ...StandardParameters.Right.Foot.Mass; };
+      AnyFolder Talus = { AnyVar MassScale = ...AnthroData.Right.talus / ...StandardParameters.Right.Talus.Mass; };  
+      AnyFolder Shank = { AnyVar MassScale = ...AnthroData.Right.lower_leg / ...StandardParameters.Right.Shank.Mass; };
+      AnyFolder Thigh = { AnyVar MassScale = ...AnthroData.Right.thigh / ...StandardParameters.Right.Thigh.Mass; };  
+    };
+    AnyFolder Left = 
+    {
+      AnyFolder Foot = { AnyVar MassScale = (...AnthroData.Left.foot+...AnthroData.Left.ball) / ...StandardParameters.Left.Foot.Mass; };
+      AnyFolder Talus = { AnyVar MassScale = ...AnthroData.Left.talus / ...StandardParameters.Left.Talus.Mass; };  
+      AnyFolder Shank = { AnyVar MassScale = ...AnthroData.Left.lower_leg / ...StandardParameters.Left.Shank.Mass; };
+      AnyFolder Thigh = { AnyVar MassScale = ...AnthroData.Left.thigh / ...StandardParameters.Left.Thigh.Mass; };  
+    };
+  };
+  
+  AnyFolder StrengthScaling = {    
+    AnyVar Rother = 0.5;          // Mass fraction in the body of organs, blood, skeleton, etc.
+    AnyVar Rfat = .FatPercent/100; // Fat ration in the entire body
+    AnyVar Rfat0 = .StandardParameters.BodyParameters.FatPercent/100;
+    AnyFolder Pelvis = { AnyVar StrengthScale = (..MassScaling.Pelvis.MassScale / ..GeometricalScaling.Pelvis.LengthScale) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
+    AnyFolder Spine = { AnyVar StrengthScale = (..MassScaling.Trunk.MassScale / ..GeometricalScaling.Trunk.LengthScale ) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
+    AnyFolder Humerus = { AnyVar StrengthScale = (..MassScaling.Humerus.MassScale / ..GeometricalScaling.Humerus.LengthScale ) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
+    AnyFolder Ulna = { AnyVar StrengthScale = (..MassScaling.Ulna.MassScale / ..GeometricalScaling.Ulna.LengthScale ) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
+    AnyFolder Hand = { AnyVar StrengthScale = (..MassScaling.Hand.MassScale / ..GeometricalScaling.Hand.ScaleFunction.LengthScale ) * ((1-.Rother-.Rfat)/(1-.Rother-.Rfat0)); };
+    
+    AnyFolder Right =
+    { 
+      AnyFolder Foot = { AnyVar StrengthScale = (...MassScaling.Right.Foot.MassScale ) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0)); };
+      AnyFolder Shank = { AnyVar StrengthScale = (...MassScaling.Right.Shank.MassScale ) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0));};
+      AnyFolder Thigh = { AnyVar StrengthScale = (...MassScaling.Right.Thigh.MassScale ) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0)); };
+    };
+    AnyFolder Left =
+    { 
+      AnyFolder Foot = { AnyVar StrengthScale = (...MassScaling.Left.Foot.MassScale ) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0)); };
+      AnyFolder Shank = { AnyVar StrengthScale = (...MassScaling.Left.Shank.MassScale) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0));};
+      AnyFolder Thigh = { AnyVar StrengthScale = (...MassScaling.Left.Thigh.MassScale) * ((1-..Rother-..Rfat)/(1-..Rother-..Rfat0)); };
+    };
+  };
+  
+  AnyFolder FiberLengthScaling = {    
+    AnyFolder Pelvis = { AnyVar FiberLengthScale = ..AnthroSegmentLengths.PelvisWidth / ..StandardParameters.Pelvis.Width; };
+    
+    AnyFolder Right =
+    {
+      AnyFolder Foot = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Right.FootLength / ...StandardParameters.Right.Foot.Length; };
+      AnyFolder Shank = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Right.ShankLength / ...StandardParameters.Right.Shank.Length; };
+      AnyFolder Thigh = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Right.ThighLength / ...StandardParameters.Right.Thigh.Length; };
+    };
+    AnyFolder Left =
+    {
+      AnyFolder Foot = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Left.FootLength / ...StandardParameters.Left.Foot.Length; };         
+      AnyFolder Shank = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Left.ShankLength / ...StandardParameters.Left.Shank.Length; };
+      AnyFolder Thigh = { AnyVar FiberLengthScale  = ...AnthroSegmentLengths.Left.ThighLength / ...StandardParameters.Left.Thigh.Length; };
+    };
+    
+  };
+  
+  AnyFolder GeometricalScaling = {
+    
+    AnyFolder Right ={
+      // Talus segment will use the GeometricalScalfing function of the Foot segment, not the following one.
+      AnyFolder Talus  = {
+        AnyVar LengthScale = ...AnthroSegmentLengths.Right.TalusLength / ...StandardParameters.Right.Talus.Length;    
+        AnyVar ms = ...MassScaling.Right.Talus.MassScale;
+        AnyVar ls = LengthScale;
+        AnyFunTransform3DLin ScaleFunction = {
+          ScaleMat = {{.ls, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, (.ms/.ls)^0.5}};
+          Offset = {0, 0, 0};
+        };
+      };
+      
+      AnyFolder Foot  = {
+        AnyVar LengthScale = ...AnthroSegmentLengths.Right.FootLength / ...StandardParameters.Right.Foot.Length;    
+        AnyVar ms =  ...MassScaling.Right.Foot.MassScale;
+        AnyVar ls = LengthScale;
+        AnyFunTransform3DLin ScaleFunction = {
+          ScaleMat = {{.ls, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, (.ms/.ls)^0.5}};
+          Offset = {0, 0, 0};            
+        };
+      };
+      
+      AnyFolder Shank = {
+        AnyVar LengthScale  =...AnthroSegmentLengths.Right.ShankLength / ...StandardParameters.Right.Shank.Length;
+        AnyVar ms = ...MassScaling.Right.Shank.MassScale;
+        AnyVar ls = LengthScale;
+        AnyFunTransform3DLin ScaleFunction = {
+          ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}} ;
+          Offset = {0, 0, 0};
+        };
+        
+      };
+      
+      AnyFolder Thigh = {
+        AnyVar LengthScale  = ...AnthroSegmentLengths.Right.ThighLength / ...StandardParameters.Right.Thigh.Length;
+        AnyVar ms = ...MassScaling.Right.Thigh.MassScale;
+        AnyVar ls = LengthScale;
+        AnyFunTransform3DLin ScaleFunction = {
+          ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}} ;
+          Offset = {0, 0, 0};
+        };
+        
+      };
+    }; // Right
+    
+    AnyFolder Left ={
+      // Talus segment will use the GeometricalScalfing function of the Foot segment, not the following one.
+      AnyFolder Talus  = {
+        AnyVar LengthScale  = ...AnthroSegmentLengths.Left.TalusLength / ...StandardParameters.Left.Talus.Length;    
+        AnyVar ms = ...MassScaling.Left.Talus.MassScale;
+        AnyVar ls = LengthScale;
+        AnyFunTransform3DLin ScaleFunction = {
+          ScaleMat = {{.ls, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, (.ms/.ls)^0.5}} ;
+          Offset = {0, 0, 0};
+        };
+      };
+      
+      AnyFolder Foot  = {
+        AnyVar LengthScale  = ...AnthroSegmentLengths.Left.FootLength / ...StandardParameters.Left.Foot.Length;    
+        AnyVar ms = ...MassScaling.Left.Foot.MassScale;
+        AnyVar ls = LengthScale;
+        AnyFunTransform3DLin ScaleFunction = {
+          ScaleMat = {{.ls, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, (.ms/.ls)^0.5}};
+          Offset = {0, 0, 0};
+        };
+      };
+      
+      AnyFolder Shank = {
+        AnyVar LengthScale  = ...AnthroSegmentLengths.Left.ShankLength / ...StandardParameters.Left.Shank.Length;
+        AnyVar ms = ...MassScaling.Left.Shank.MassScale;
+        AnyVar ls = LengthScale;
+        AnyFunTransform3DLin ScaleFunction = {
+          ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}}';
+          Offset = {0, 0, 0};
+        };
+      };
+      
+      AnyFolder Thigh = {
+        AnyVar LengthScale  = ...AnthroSegmentLengths.Left.ThighLength / ...StandardParameters.Left.Thigh.Length;
+        AnyVar ms = ...MassScaling.Left.Thigh.MassScale;
+        AnyVar ls = LengthScale;
+        AnyFunTransform3DLin ScaleFunction = {
+          ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
+          Offset = {0, 0, 0};
+        };
+        
+        
+      };
+    }; // Left
+    
+    // Common law for the upper body
+    // *****************************
+    
+    AnyFolder Pelvis = {
+      AnyVar LengthScale =  ..AnthroSegmentLengths.PelvisWidth / ..StandardParameters.Pelvis.Width;
+      //AnyVar DepthScale =  ..AnthroSegmentLengths.PelvisDepth / ..StandardParameters.Pelvis.Depth;
+      AnyVar ms = ..MassScaling.Pelvis.MassScale;
+      AnyVar ls = LengthScale;
+      //AnyVar ds = DepthScale;
+      //      AnyFunTransform3DLin ScaleFunction = {
+      //        ScaleMat = {{.ds, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, .ls}};
+      //        Offset = {0, 0, 0};
+      //      };
+      
+      AnyFunTransform3DLin ScaleFunction = 
+      {
+        ScaleMat = {{ (.ms/.ls)^0.5, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, .ls}};
+//        ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, (.ms/.ls)^0.5, 0},{0, 0, .ls}};
+        Offset = {0, 0, 0};
+      };      
+    };
+    
+    AnyFolder Trunk = {
+      AnyVar LengthScale = (..AnthroSegmentLengths.TrunkHeight / ..StandardParameters.Trunk.Height);
+      AnyVar WidthScale = (..AnthroSegmentLengths.TrunkWidth / ..StandardParameters.Trunk.Width );
+      // HackWorkAround to add the width to the standard parameters
+      AnyFolder &stdpar = ..StandardParameters.Trunk;
+      stdpar = {
+        AnyVar Width = 0.332; // Distance beween the acromium in neutral position. 
+      };
+      AnyVar ms = ..MassScaling.Trunk.MassScale;
+      AnyVar ls = LengthScale;
+      AnyVar ws = WidthScale;
+      AnyFunTransform3DLin ScaleFunction = {
+        // This breaks the default concept of LengthMassFat scaling.
+        ScaleMat = {{ .ws , 0, 0},{0, .ls, 0},{0, 0, .ws}};
+        Offset = {0,0,0};
+      };
+    };
+    
+    AnyFolder Head = {
+      AnyVar LengthScale = (..AnthroSegmentLengths.HeadHeight / ..StandardParameters.Head.Height);
+      AnyVar ms = ..MassScaling.Head.MassScale;
+      AnyVar ls = LengthScale;
+      AnyFunTransform3DLin ScaleFunction = {
+        ScaleMat = {{.ls, 0, 0},{0, .ls, 0},{0, 0, .ls}};
+        Offset = {0,0,0};
+      };
+    };
+    
+    
+    AnyFolder Cervical = {
+      AnyVar LengthScale = (..AnthroSegmentLengths.NeckLength / ..StandardParameters.Neck.Length);
+      // HackWorkAround to add the width to the standard parameters
+      AnyFolder &stdpar = ..StandardParameters;
+      stdpar = {
+        AnyFolder Neck = {
+           AnyVar Length = 0.1357; // Distance beween the C7T1 joint to C1C0 joint. 
+        };
+      };
+      AnyVar ms = ..MassScaling.Cervical.MassScale;
+      AnyVar ls = LengthScale;
+      AnyFunTransform3DLin ScaleFunction = {
+        // This breaks the default concept of LengthMassFat scaling.
+        ScaleMat = {{ (.ms/.ls)^0.5 , 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
+        Offset = {0,0,0};
+      };
+    
+    };
+    
+    AnyFolder &PelvisSeg = Pelvis;    
+    AnyFolder &SkullSeg = Head;
+    AnyFolder &ThoraxSeg = Trunk;
+    
+    AnyFolder &C1Seg = Cervical;
+    AnyFolder &C2Seg = Cervical;
+    AnyFolder &C3Seg = Cervical;
+    AnyFolder &C4Seg = Cervical;
+    AnyFolder &C5Seg = Cervical;
+    AnyFolder &C6Seg = Cervical;
+    AnyFolder &C7Seg = Cervical;
+    
+    AnyFolder &L1Seg = Lumbar;
+    AnyFolder &L2Seg = Lumbar;
+    AnyFolder &L3Seg = Lumbar;
+    AnyFolder &L4Seg = Lumbar;
+    AnyFolder &L5Seg = Lumbar;
+    AnyFolder &SacrumSeg = PelvisSeg;
+    
+    AnyFolder Lumbar = {
+      AnyVar LengthScale = (..AnthroSegmentLengths.TrunkHeight / ..StandardParameters.Trunk.Height);
+      AnyVar ms = ..MassScaling.Lumbar.MassScale;
+      AnyVar ls = LengthScale;
+      AnyFunTransform3DLin ScaleFunction = {
+        ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
+        Offset = {0,0,0};
+      };
+    };
+    
+    AnyFolder Clavicula = {
+      AnyFunTransform3DLin ScaleFunction = {
+        //        AnyMat33 ARel={{-0.280836, -0.004752, 0.959744}, {0.188095, 0.980323, 0.059893}, {-0.941144, 0.197343, -0.274416}};
+        
+        AnyMat33 ARel= {      {-0.280836,  0.188095, -0.941144},      {-0.004752,  0.980323, 0.197343},       { 0.959744, 0.059893,  -0.274416}}';
+        
+        
+        ScaleMat = ARel*..Trunk.ScaleFunction.ScaleMat*(ARel');
+        Offset = {0,0,0}*ARel';
+      };
+      
+    };
+    
+    
+    
+    AnyFolder Scapula = {
+      AnyFunTransform3DLin ScaleFunction = {
+        //AnyMat33 ARel ={{0.588988, 0.186879, 0.786238}, {-0.159489, 0.980641, -0.113609}, {-0.792248, -0.058482, 0.607391}};
+        AnyMat33 ARel ={{0.561294, -0.097357, -0.821870},    {0.151325, 0.988389, -0.013736},    {0.813664, -0.116660, 0.569509}}';
+        
+        
+        ScaleMat = ARel*..Trunk.ScaleFunction.ScaleMat*(ARel');
+        Offset = {0,0,0}*ARel';
+      };
+    };
+    
+    AnyFolder Humerus = {
+      AnyVar LengthScale = (..AnthroSegmentLengths.UpperArmLength / ..StandardParameters.Humerus.Length);
+      AnyVar ms = ..MassScaling.Humerus.MassScale;
+      AnyVar ls = LengthScale;      
+      AnyFunTransform3DLin ScaleFunction = {
+        ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
+        Offset = {0,0,0};
+      };
+    };
+    
+    AnyFolder Ulna = {
+      AnyVar LengthScale = (..AnthroSegmentLengths.LowerArmLength / ..StandardParameters.Ulna.Length);
+      AnyVar ms = ..MassScaling.Ulna.MassScale;
+      AnyVar ls = LengthScale;
+      AnyFunTransform3DLin ScaleFunction = {
+        ScaleMat = {{(.ms/.ls)^0.5, 0, 0},{0, .ls, 0},{0, 0, (.ms/.ls)^0.5}};
+        Offset = {0,0,0};
+      };
+    };
+    
+    AnyFolder Radius = {
+      AnyFunTransform3DLin ScaleFunction = {
+        //This Arel is used for mapping the scaling of ulna into the radius coordinate system 
+        //which is rotated, Arel has been found for a neutral position
+        AnyMat33 ARel = {{-0.145873, -0.989303, -0.000001}, {0.989303, -0.145873, 0.000001}, {-0.000001, -0.000000, 1.000000}};
+        AnyMat33 ScaleXYZ = ..Ulna.ScaleFunction.ScaleMat;
+        ScaleMat = ARel'*ScaleXYZ*ARel;
+        Offset = {0,0,0}*ARel;      };
+    };
+    
+    AnyFolder Hand = {
+      AnyVar HandLength =..AnthroSegmentLengths.HandLength;
+      AnyVar HandBreadth = ..AnthroSegmentLengths.HandBreadth;
+      AnyFunTransform3DLin ScaleFunction = {
+        AnyVar BreadthScale = .HandBreadth/...StandardParameters.Hand.HandBreadth;
+        AnyVar LengthScale =  .HandLength/...StandardParameters.Hand.HandLength;
+        
+        ScaleMat ={{LengthScale,0,0},{0,BreadthScale,0},{0,0,BreadthScale}};
+        
+        Offset = {0,0,0};
+      };
+    };
+    
+  };
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+