Facet joint lumbar spine model - ligaments length and force

Hi,

I am currently working with the Facet joint lumbar spine model, in which I enabled the lumbar ligaments (with command “#define BM_TRUNK_LUMBAR_LIGAMENTS ON”). I simply tried to plot the joint reaction forces at the lumbar vertebrae during the standing position, due to gravity, and during a 40 degrees flexion of the trunk.
I got puzzled by the results of the ligaments forces: for the standing analysis (position and velocities of all drivers are zero), results show that a ligament (InterTransverseMid) develops a constant force of around 110N. If I perform the calibration before the inverse dynamics analysis, the force in that ligament goes to zero, but another ligament (InterTransverse) develops a constant force of around 150N. The same happens with the 40 degrees flexion. I am attaching the forces graph of the two ligaments, during flexion and in standing position.
I was expecting the ligaments to produce zero force at the standing position, and starting develop a force during the flexion only.
Am I doing something wrong?

Many thanks,

Michele

Hi Michele,

You need to run the calibration before your inverse dynamics analysis. This study adjusts slack length values for each ligament depending on the current human size and geometry. As you correctly noticed it uses a 0-position to find slack lengths of the ligaments.

When you run the inverse dynamics operation - posture changes a little different. I have looked at the drivers and see that it uses 5 degrees extension. I believe it was intended to initiate facet joint contact. This gives some forces in the ligaments.

But the force value was indeed too large due to an error which is fixed in with the next version of AMMR. The 2 ligament branches of the intertransverse ligament were sharing the same ligament model, which was calibrated to the shorter slack length.

Please find corrections in the attached files. You need to copy these files to the AMMR\Body\AAUHuman\Trunk\ folder.

Kind regards,
Pavel

Thank you Pavel, that solved the problem.
Only one doubt: I modified the file “Model/JointsAndDriversSimple.any” so to have the driver position for flexion starting at 0, instead of the 5 degrees extension you pointed out (as you can see in the attachment). But when I run the inverse dynamics for a 40 degrees flexion (set in DriverVel), I see an initial decreasing in the joint reaction forces in the lumbar segments (screenshot attached). Is it because there still is a 5 degrees extension at the beginning of the analysis, or simply because that is the physiological response for that motion?

Many thanks,

Michele

Hi Michele,

Yes, that must the physiological response. Looks like our all-zeros posture is slightly suboptimal from the perspective of the joint reaction forces.

Kind regards,
Pavel

Thank you again!

Best,

Michele

Hello Pavel,

I was working on ligaments and I think I noticed something that might be wrong (I'm not sure though) in the definition of lumbar ligaments, both in the versions you sent me and in the default ones in the repository.
Basically I saw stiffness vectors are defined in the file Trunk/LigamentsLumbar.any, with 6 elements, one for each spine segment:

   // mean stiffness values from Pintar et al. 1992, J Biomech
   // stiffness vector L1L2, L2L3, L3L4, L4L5, L5Sacrum given in N/mm^-1
   AnyVector  kALL = {32.9, 32.4, 20.8, 39.5, 40.5, 13.2}*mm2m;     // conversion to N/m
   AnyVector  kPLL = {10.0, 17.1, 36.6, 10.6, 25.8, 21.8}*mm2m;     // conversion to N/m
   AnyVector  kISL = {12.1, 10.0, 9.6,  18.1, 8.7,  16.3}*mm2m;       // conversion to N/m   
   AnyVector  kSSL = {15.1, 23.0, 24.8, 34.8, 18.0, 17.8}*mm2m;     // conversion to N/m
   AnyVector  kLF  = {24.2, 23.0, 25.1, 34.5, 27.2, 20.2}*mm2m/2.0; // conversion to N/m + splitting (2 lig parts)

Then each one of the ligaments files refers to these vector in its file, pointing to the correspondent component of the vectors by means of an index "li", as I understand, like for L1L2Ligaments.any:

// Ligament group index
AnyIntVar li = 1;
// generic ligament lengths for the standard man
// (need to be calibrated if scaled)
ALLL1L2.L0 = 4.472135954999584e-003;
PLLL1L2.L0 = 2.828427124746193e-003;
ISL1L2.L0 = 1.784656829757482e-002;
SSL1L2.L0 = 1.926272306814388e-002;
FlavumL1L2.L0 = 1.369306393762912e-002;
#ifndef exclude_it
InterTransverseL1L2.L0 = 3.167885312722565e-002;
#endif

#ifndef exclude_all
AnyLigamentModelPol ALLL1L2 =
{
////L0 = .al_slack_length*1.5;
eps1 = ..epsALL[.li];
F1 = ..kALL[.li]eps1L0;
};

But it seems like in two files, L3L4Ligaments.any and L4L5Ligaments.any, the index is defined but not used, and an integer is used instead, which does not correspond to the index, for example in L3L4:

// Ligament group index
AnyIntVar li = 3; 
// generic ligament lengths for the standard man 
// (need to be calibrated if scaled)
ALLL3L4.L0 = 1.216552506059645e-002;
PLLL3L4.L0 = 3.000000000000114e-003;
ISL3L4.L0 = 5.000000000000116e-003;
SSL3L4.L0 = 7.516648189186516e-003;
FlavumL3L4.L0 = 6.422616289332482e-003;

#ifndef exclude_it
InterTransverseL3L4.L0 = 2.454083213086497e-002;
#endif

#ifndef exclude_all
AnyLigamentModelPol ALLL3L4 =
{
////L0 = .al_slack_length*1.5;
eps1 = ..epsALL[2];
F1 = ..kALL[2]eps1L0;
};

Shall those "[2]" be substituted with "[.li]" or are the files correct the way they are written now?

Thank you,

Michele

Hi Michele,

They seem to be correct (L3L4 level is the third component), I would not change it.

Regards,
Pavel

Thank you Pavel,

only one doubt: are you sure L3L4 is the third component? Because I think in this description T12L1 is missing:

// stiffness vector L1L2, L2L3, L3L4, L4L5, L5Sacrum given in N/mm^-1

But in reality the vector includes T12L1 as well, as there are 6 components, as I also see at the bottom of the same file:

AnyFolder T12L1Lig = {#include "T12L1Ligaments.any"};
AnyFolder L1L2Lig = {#include "L1L2Ligaments.any"};
AnyFolder L2L3Lig = {#include "L2L3Ligaments.any"};
AnyFolder L3L4Lig = {#include "L3L4Ligaments.any"};
AnyFolder L4L5Lig = {#include "L4L5Ligaments.any"};
AnyFolder L5SacrumLig = {#include "L5SacrumLigaments.any"};

It looks like L3L4 should be the fourth, isn't it?

Also, if not modified, two ligaments use the same component of the vector:

Beginning of L2L3 file:

// Ligament group index
AnyIntVar li = 2; 
// generic ligament lengths for the standard man 
// (need to be calibrated if scaled)        
ALLL2L3.L0 = 8.246211251235329e-003;
PLLL2L3.L0 = 3.162277660168488e-003;
ISL2L3.L0 = 9.192388155425075e-003;
SSL2L3.L0 = 1.128051417267838e-002;
FlavumL2L3R.L0 = 7.968688725254674e-003;
FlavumL2L3L.L0 = 7.968688725254674e-003;

#ifndef exclude_it
InterTransverseL2L3R.L0 = 3.362046072194278e-002;
InterTransverseL2L3L.L0 = 3.362046072194278e-002;
InterTransverseL2L3midR.L0 = 3.362046072194278e-002;
InterTransverseL2L3midL.L0 = 3.362046072194278e-002;
#endif

#ifndef exclude_all
AnyLigamentModelPol ALLL2L3 =
{
////L0 = .al_slack_length*1.5;
eps1 = ..epsALL[.li];
F1 = ..kALL[.li]eps1L0;
};

AnyViaPointLigament lALLofL2L3 = {
  AnyRefNode &Ori = ...SegmentsLumbar.L2Seg.ALLNodeInferior;
  AnyRefNode &End = ...SegmentsLumbar.L3Seg.ALLNodeSuperior;
  
  AnyLigamentModelPol &Model = .ALLL2L3;
  AnyDrawPLine drw = {
    Thickness = 0.005;
    RGB = {1,0,0};
  };
};   

Beginning of L3L4 file:

// Ligament group index
AnyIntVar li = 3;
// generic ligament lengths for the standard man
// (need to be calibrated if scaled)
ALLL3L4.L0 = 1.216552506059645e-002;
PLLL3L4.L0 = 3.000000000000114e-003;
ISL3L4.L0 = 5.000000000000116e-003;
SSL3L4.L0 = 7.516648189186516e-003;
FlavumL3L4R.L0 = 6.422616289332482e-003;
FlavumL3L4L.L0 = 6.422616289332482e-003;
#ifndef exclude_it
InterTransverseL3L4R.L0 = 2.454083213086497e-002;
InterTransverseL3L4L.L0 = 2.454083213086497e-002;
InterTransverseL3L4midR.L0 = 2.454083213086497e-002;
InterTransverseL3L4midL.L0 = 2.454083213086497e-002;
#endif

#ifndef exclude_all
AnyLigamentModelPol ALLL3L4 =
{
////L0 = .al_slack_length*1.5;
eps1 = ..epsALL[2];
F1 = ..kALL[2]eps1L0;
};

AnyViaPointLigament lALLofL3L4 = {
  AnyRefNode &Ori = ...SegmentsLumbar.L3Seg.ALLNodeInferior;
  AnyRefNode &End = ...SegmentsLumbar.L4Seg.ALLNodeSuperior;
  
  AnyLigamentModelPol &Model = .ALLL3L4;
  AnyDrawPLine drw = {
    Thickness = 0.005;
    RGB = {1,0,0};
  };
};   

They both use the third component, while it seems none of the ligaments files uses the fifth component.

Could you please confirm?

Thank you,

Michele

Hi Michele,

I looked back at the paper, and it, indeed, like you say, starts from T12L1. So we do have a typo in these values. We should adjust it to the proper index, which would .li in this case. I will change it in the repository for the next releases. But I suspect (and hope) it should not change behaviour of the models much.

Kind regards,
Pavel

Thanks Pavel,
I also modified the files. I agree it should not make that much difference.

There is another thing I would like to ask a clarification about the default models, but I’ll open a new thread since it is not correlated to ligaments.

Best,

Michele