Muscle recruitment with volume factor


I’m using AMS v.7.1 and AMMR v.2.1.1.

I’m a little interested in know how to introduce the normalization factor based on the muscle volume as shown as Marra did before. Are there any tutorials or code?

[ Marra M A, Vanheule V, Fluit, René, et al. A Subject-Specific Musculoskeletal Modeling Framework to Predict In Vivo Mechanics of Total Knee Arthroplasty[J]. Journal of Biomechanical Engineering, 2015, 137(2):020904. ]

Thank you very much!

Best Regards,

And where could I get the volume of each muscle?

Hi @Nickel_Lee

Which version of the AMMR are you using? In the newest version the volume is a variable in the muscle models called Vol0 (only for the lower extremities, the rest of the body will be updated in AMMR 2.3).

If you have an older version of the AMMR you can calculate backwards to find the volume. For example:

\mathrm{Vol}_0 = L_{f0}\frac{F_0}{\mathrm{PCSA}_{Factor}}

I think that was what Marra (@marcopus) did in the paper, or maybe he used his own dataset of volumes for the muscles.

To apply the setting in the recruitment algorithm you should use the setting called:


With that set, the recruitment algorithm will add the variables found in the muscles folders which match Weight_SearchName as the weight factor.

There is a small catch though. The search will only find variables in the muscle folder, and the volume (Vol0) is located in the muscle model (which there is only a reference to in the muscle object).

So we need to create a variable in the muscle objects that holds the volume.

Main.HumanModel.BodyModel.Right.Leg.Mus.SoleusMedialis1 = {
   AnyVar Volume = MusMdl.Vol0;

And then we can set Weight_SearchName:

Study.InverseDynamics.Criterion.PrimaryTerm = {
   Weight_SearchName = "Volume";

Doing this for all muscles in the leg is a bit annoying but here is a small include file that does this.

HookTLEMMuscles.any (16.7 KB)

You would use like the example below to add volume weighted recruitment to any model:

#include "../libdef.any"

Main = {


#include "<ANYBODY_PATH_BODY>/HumanModel.any"

  #define WEIGHTFACTOR MusMdl.Vol0 
  Main.HumanModel.BodyModel.Right.Leg.Mus = {
    #include "HookTLEMMuscles.any"
  Main.HumanModel.BodyModel.Left.Leg.Mus = {
    #include "HookTLEMMuscles.any"

  AnyBodyStudy Study = {
     Gravity = {0, 0, -9.81};
     AnyFolder& BodyModel = Main.HumanModel.BodyModel;
     AnyFolder& DefaultDrivers = Main.HumanModel.DefaultMannequinDrivers;
     InverseDynamics.Criterion.PrimaryTerm.Weight_SearchName = "WeightFactor"; 


Download example: VolumeRecruitment.main.any (698 Bytes)

I hope this helps you. In future version of AMS volume recruitment will probably be built-in. But with AnyBody 7.2.2 this hack is still needed.

Best wishes,

@Nickel_Lee. I saw that wrote you were using AMMR 2.1.1. That has does have volumes for the lower extremity.

Just note that the volumes are in m3 (i.e. small values), so it may be necessary to scale volumes to get the recruitment algorithm to run robustly. But it is not something I have any experience with. Good luck :slight_smile: