Increasing DOF in the wheelchair model - continued

Thank you for all your help, Soren! I have slowly made progress
increasing the degrees of freedom in the model by driving the pelvis
and trunk positions with mocap data, however I still have a few
questions. First off, let me tell you what I have done so far:

  • Using trochanter markers, I am able to drive the pelvis in the x-
    (anterior/posterior), y- (inferior/superior), and z- (medial/lateral)
    directions. I drive the right trochanter in the x- and y- directions,
    and the left trochanter in the y- and z- directions. In lieu of these
    drivers, I have taken out the old “SeatHeight” driver.
  • Using the shoulder markers (lateral border of the AC), I am driving
    the x- direction (sterno-clavicular protraction/retraction) with mocap
    data. To do this I took out the corresponding driver in the
    “SCDriverRight” and “SCDriverLeft.” I still however, am unable to
    successfully drive the elevation/depression of the shoulders, which I
    eventually want to be able to do.
  • I am driving the sternum in the x- and z- directions, the C7 marker
    in the z- direction, and the T3 marker in the y- direction. I have
    removed the “SeatBackDriver,” and the PelvisThoraxLateralBending and
    PelvisThoraxRotation from the “PostureDriver” (I still have the
    PelvisThoraxExtension being driven by the “PostureDriver”).

I can get the model to compile, and SetInitialConditions, however the
individual is inaccurately tilted to the left (see the two images I
have uploaded showing the mocap data at pushrim contact for this
particular individual). When I run the KinematicAnalysis I get the
following warning at frame 46 (out of 58):

WARNING(OBJ.MCH.MUS2) :
BRep\Aalborg\Arm3D\Muscle-parameters-shoulder.any(1310) :
‘trapezius_scapular_part_4’ : Muscle without strength : The muscle
has been stretched too much

Followed by the error in frame 55:

ERROR : BRep\Aalborg\Arm3D\Muscle.any(36) :
biceps_brachii_caput_breve : Unexpected exception in the library
OOSol : OOSol exception : General factorization exception : Negative
or zero pivot

At which point the analysis ends.

I would still like to completely free up the posture driver and have
something drive the thorax flexion/extension (I am still unsure as
to how to potentially re-adjust the STN, C7, and T3 markers to do
this). And I want to allow elevation/depression of the shoulders by
taking out the driver that holds this constant (in the SCDriverRight
and –Left), by using the shoulder markers to do this.

I have uploaded the current model (SarahArmModel - Muscles -
IncreasingDOF_6-22-07.zip), in which there are the aforementioned
pictures (PASaggital.jpeg and PAFrontal.bmp) for reference. If you
could take a look at it and give me any suggestions you may have, I
would really appreciate it!

As always, thank you for your help,
Sarah

PS – At this point, I’m not too concerned because I think when the
kinematics are correct it may help, but I am currently unable to get
the InverseDynamicAnalysis to run at all due to the following problem:

ERROR(OBJ1) : ArmModel.main.any(61) : ‘MyStudy’ : Muscle
recruitment analysis failed, simplex solver reports that solution does
not satisfy all constraints.

Like I said, I think that with correct kinematics this may change, but
I figured I would let you know about my problems with this analysis.

Hi Sarah

The first error you get means that this muscle is overstretched the
quick fix to this is to switch to the simple muscle model, by
shifting the include statement, this i would recommend at this stage
of the model. Shifting the muscle model may help on the recruiment
problems, too.

The second error is a wrapping error; the fix is usually to increase
the property SPLine.StringMesh for example by 10 or 20.

I have tried to run your model but i miss some markers you have
defined in the BRep i think.

In the MarkerPosOnBody.any file you define the some new markers by
creating nodes inside markernodes already existing

So the lines

// AnyFolder &C7 =
Main.MyArm.HumanModel.Trunk.SegmentsThorax.ThoraxSeg.C7Marker;
// C7={
// AnyRefNode C7 = {
// sRel = {0,0,0};//{-0.06,0.005,0};//{-0.03,-.028,0.00};
// AnyDrawNode drw={
// ScaleXYZ={0.01,.01,.01};
// RGB={0,0,1};
// };
// };
// };

Will create a new node “C7” inside the node named “C7Marker” i do
not really understand the purpose of this.

I think it would be better to do the following

AnyFolder &thorax =
Main.MyArm.HumanModel.Trunk.SegmentsThorax.ThoraxSeg;
// thorax={
// AnyRefNode C7Marker = {
// sRel = x?, y?, z?
// AnyDrawNode drw={
// ScaleXYZ={0.01,.01,.01};
// RGB={0,0,1};
// };
// };
// };

and then at the same time remove the markers from the bRep.

This will allow me to run you model without changeing the BRep.

Best regards
Søren

— In anyscript@yahoogroups.com, “Sarah R. Sullivan” <sarsulli@…>
wrote:
>
> Thank you for all your help, Soren! I have slowly made progress
> increasing the degrees of freedom in the model by driving the
pelvis
> and trunk positions with mocap data, however I still have a few
> questions. First off, let me tell you what I have done so far:
>
> - Using trochanter markers, I am able to drive the pelvis in
the x-
> (anterior/posterior), y- (inferior/superior), and z-
(medial/lateral)
> directions. I drive the right trochanter in the x- and y-
directions,
> and the left trochanter in the y- and z- directions. In lieu of
these
> drivers, I have taken out the old “SeatHeight” driver.
> - Using the shoulder markers (lateral border of the AC), I am
driving
> the x- direction (sterno-clavicular protraction/retraction) with
mocap
> data. To do this I took out the corresponding driver in the
> “SCDriverRight” and “SCDriverLeft.” I still however, am unable to
> successfully drive the elevation/depression of the shoulders,
which I
> eventually want to be able to do.
> - I am driving the sternum in the x- and z- directions, the C7
marker
> in the z- direction, and the T3 marker in the y- direction. I have
> removed the “SeatBackDriver,” and the PelvisThoraxLateralBending
and
> PelvisThoraxRotation from the “PostureDriver” (I still have the
> PelvisThoraxExtension being driven by the “PostureDriver”).
>
> I can get the model to compile, and SetInitialConditions, however
the
> individual is inaccurately tilted to the left (see the two images I
> have uploaded showing the mocap data at pushrim contact for this
> particular individual). When I run the KinematicAnalysis I get the
> following warning at frame 46 (out of 58):
>
> WARNING(OBJ.MCH.MUS2) :
> BRep\Aalborg\Arm3D\Muscle-parameters-shoulder.any(1310) :
> ‘trapezius_scapular_part_4’ : Muscle without strength : The
muscle
> has been stretched too much
>
> Followed by the error in frame 55:
>
> ERROR : BRep\Aalborg\Arm3D\Muscle.any(36) :
> biceps_brachii_caput_breve : Unexpected exception in the
library
> OOSol : OOSol exception : General factorization exception :
Negative
> or zero pivot
>
> At which point the analysis ends.
>
> I would still like to completely free up the posture driver and
have
> something drive the thorax flexion/extension (I am still unsure
as
> to how to potentially re-adjust the STN, C7, and T3 markers to do
> this). And I want to allow elevation/depression of the shoulders
by
> taking out the driver that holds this constant (in the
SCDriverRight
> and –Left), by using the shoulder markers to do this.
>
> I have uploaded the current model (SarahArmModel - Muscles -
> IncreasingDOF_6-22-07.zip), in which there are the aforementioned
> pictures (PASaggital.jpeg and PAFrontal.bmp) for reference. If you
> could take a look at it and give me any suggestions you may have, I
> would really appreciate it!
>
> As always, thank you for your help,
> Sarah
>
> PS – At this point, I’m not too concerned because I think when the
> kinematics are correct it may help, but I am currently unable to
get
> the InverseDynamicAnalysis to run at all due to the following
problem:
>
> ERROR(OBJ1) : ArmModel.main.any(61) : ‘MyStudy’ : Muscle
> recruitment analysis failed, simplex solver reports that solution
does
> not satisfy all constraints.
>
> Like I said, I think that with correct kinematics this may change,
but
> I figured I would let you know about my problems with this
analysis.
>

Hi Soren,

Thanks for your help - you are right, I had made some nodes in the BRep files on
the thorax and scapula for the C7, T3, STN, and AC markers. I have now changed
that so that everything is contained in the ARep. Before I re-upload the file,
I have a question that might help me figure out some of my problems. I have
just realized that the body is slightly twisted in space - not perfectly aligned
to the global reference system as would be indicated in the model. This makes
sense, as when the Vicon mocap cameras are calibrated and the wheelchair
subsequently placed for analysis, it would be nearly impossible to align the
subject/wheelchair up exactly as the room has been calibrated (with regards to
the coordinate systems). So, for example, when I am trying to drive the pelvis
based on coordinates relative to the hubs (whose axes are not aligned with the
global coordinate axes), I have typed in the following:

AnyKinLinear PelvisPos = {
AnyFixedRefFrame &Ground = …EnvironmentModel.GlobalRef;
AnyRefNode &Tuber =
Main.MyArm.HumanModel.Trunk.SegmentsLumbar.PelvisSeg.TuberIschiadicumCenter;
};

AnyKinRotational PelvisRot = {
AnyFixedRefFrame &Ground = …EnvironmentModel.GlobalRef;
AnySeg &Pelvis = Main.MyArm.HumanModel.Trunk.SegmentsLumbar.PelvisSeg;
Type = RotAxesAngles;
};

AnyReacForce PelvisReac = {
AnyKinRotational &ref = .PelvisRot;
};

AnyKinEqSimpleDriver SeatHeight = {
AnyKinLinear &PelvisRot = .PelvisPos;
MeasureOrganizer = {2};
DriverPos = {
0.0125307 //This is because the subject is not evenly situated in the
chair - they are shifted slightly to the right
};

 DriverVel = {0};
 Reaction.Type = {1};

};

And the fact that I have the following as well:

AnyKinRotational ThoraxRot = {
AnySeg &Thorax= .Thorax;
AnyFixedRefFrame &Ground = …EnvironmentModel.GlobalRef;
Type = RotAxesAngles;
};

Won’t these commands be a problem if the body is slightly twisted in space?
Maybe I am a little confused, but I think I have to rearrange the global axes to
align with the hubs axes if I want to drive my markers with respect to the hub.
Am I correct in thinking this? If so, do you have any suggestions as to how to
go about this, or if I am incorrect, can you point me in the right direction?

Thank you again for your time,
Sarah

-----Original Message-----

> Date: Wed Jun 27 08:18:42 EDT 2007
> From: “AnyBody Support” <support@anybodytech.com>
> Subject: [AnyScript] Re: Increasing DOF in the wheelchair model - continued
> To: anyscript@yahoogroups.com
>
>
>
> Hi Sarah
>
> The first error you get means that this muscle is overstretched the
> quick fix to this is to switch to the simple muscle model, by
> shifting the include statement, this i would recommend at this stage
> of the model. Shifting the muscle model may help on the recruiment
> problems, too.
>
> The second error is a wrapping error; the fix is usually to increase
> the property SPLine.StringMesh for example by 10 or 20.
>
>
> I have tried to run your model but i miss some markers you have
> defined in the BRep i think.
>
> In the MarkerPosOnBody.any file you define the some new markers by
> creating nodes inside markernodes already existing
>
> So the lines
>
> // AnyFolder &C7 =
> Main.MyArm.HumanModel.Trunk.SegmentsThorax.ThoraxSeg.C7Marker;
> // C7={
> // AnyRefNode C7 = {
> // sRel = {0,0,0};//{-0.06,0.005,0};//{-0.03,-.028,0.00};
> // AnyDrawNode drw={
> // ScaleXYZ={0.01,.01,.01};
> // RGB={0,0,1};
> // };
> // };
> // };
>
> Will create a new node “C7” inside the node named “C7Marker” i do
> not really understand the purpose of this.
>
> I think it would be better to do the following
>
> AnyFolder &thorax =
> Main.MyArm.HumanModel.Trunk.SegmentsThorax.ThoraxSeg;
> // thorax={
> // AnyRefNode C7Marker = {
> // sRel = x?, y?, z?
> // AnyDrawNode drw={
> // ScaleXYZ={0.01,.01,.01};
> // RGB={0,0,1};
> // };
> // };
> // };
>
> and then at the same time remove the markers from the bRep.
>
> This will allow me to run you model without changeing the BRep.
>
>
> Best regards
> Søren
>
>
> — In anyscript@yahoogroups.com, “Sarah R. Sullivan” <sarsulli@…>
> wrote:
> >
> > Thank you for all your help, Soren! I have slowly made progress
> > increasing the degrees of freedom in the model by driving the
> pelvis
> > and trunk positions with mocap data, however I still have a few
> > questions. First off, let me tell you what I have done so far:
> >
> > - Using trochanter markers, I am able to drive the pelvis in
> the x-
> > (anterior/posterior), y- (inferior/superior), and z-
> (medial/lateral)
> > directions. I drive the right trochanter in the x- and y-
> directions,
> > and the left trochanter in the y- and z- directions. In lieu of
> these
> > drivers, I have taken out the old “SeatHeight” driver.
> > - Using the shoulder markers (lateral border of the AC), I am
> driving
> > the x- direction (sterno-clavicular protraction/retraction) with
> mocap
> > data. To do this I took out the corresponding driver in the
> > “SCDriverRight” and “SCDriverLeft.” I still however, am unable to
> > successfully drive the elevation/depression of the shoulders,
> which I
> > eventually want to be able to do.
> > - I am driving the sternum in the x- and z- directions, the C7
> marker
> > in the z- direction, and the T3 marker in the y- direction. I have
> > removed the “SeatBackDriver,” and the PelvisThoraxLateralBending
> and
> > PelvisThoraxRotation from the “PostureDriver” (I still have the
> > PelvisThoraxExtension being driven by the “PostureDriver”).
> >
> > I can get the model to compile, and SetInitialConditions, however
> the
> > individual is inaccurately tilted to the left (see the two images I
> > have uploaded showing the mocap data at pushrim contact for this
> > particular individual). When I run the KinematicAnalysis I get the
> > following warning at frame 46 (out of 58):
> >
> > WARNING(OBJ.MCH.MUS2) :
> > BRep\Aalborg\Arm3D\Muscle-parameters-shoulder.any(1310) :
> > ‘trapezius_scapular_part_4’ : Muscle without strength : The
> muscle
> > has been stretched too much
> >
> > Followed by the error in frame 55:
> >
> > ERROR : BRep\Aalborg\Arm3D\Muscle.any(36) :
> > biceps_brachii_caput_breve : Unexpected exception in the
> library
> > OOSol : OOSol exception : General factorization exception :
> Negative
> > or zero pivot
> >
> > At which point the analysis ends.
> >
> > I would still like to completely free up the posture driver and
> have
> > something drive the thorax flexion/extension (I am still unsure
> as
> > to how to potentially re-adjust the STN, C7, and T3 markers to do
> > this). And I want to allow elevation/depression of the shoulders
> by
> > taking out the driver that holds this constant (in the
> SCDriverRight
> > and –Left), by using the shoulder markers to do this.
> >
> > I have uploaded the current model (SarahArmModel - Muscles -
> > IncreasingDOF_6-22-07.zip), in which there are the aforementioned
> > pictures (PASaggital.jpeg and PAFrontal.bmp) for reference. If you
> > could take a look at it and give me any suggestions you may have, I
> > would really appreciate it!
> >
> > As always, thank you for your help,
> > Sarah
> >
> > PS – At this point, I’m not too concerned because I think when the
> > kinematics are correct it may help, but I am currently unable to
> get
> > the InverseDynamicAnalysis to run at all due to the following
> problem:
> >
> > ERROR(OBJ1) : ArmModel.main.any(61) : ‘MyStudy’ : Muscle
> > recruitment analysis failed, simplex solver reports that solution
> does
> > not satisfy all constraints.
> >
> > Like I said, I think that with correct kinematics this may change,
> but
> > I figured I would let you know about my problems with this
> analysis.
> >
>
>

Hi Sarah

The commands listed will do the following:

Measure linear translations between pelvis and global

Measure the rotation between pelvis and global

Add a reaction force on the rotation measure, ie create momments

Drive the height of pelvis in the x direction

Measure the rotations of thorax wrt. to globalref

So in practice it drives the height of the pelvis wrt. to the seat
and this load is carried, and then there is moment reaction between
pelvis and globalref.

I am not sure if this driver setup is what you intendend and if it
will cause problems, it depends on the the objective.

Best regards
Søren, AnyBody support

— In anyscript@yahoogroups.com, “Sarah R. Sullivan” <sarsulli@…>
wrote:
>
> Hi Soren,
>
> Thanks for your help - you are right, I had made some nodes in the
BRep files on the thorax and scapula for the C7, T3, STN, and AC
markers. I have now changed that so that everything is contained in
the ARep. Before I re-upload the file, I have a question that might
help me figure out some of my problems. I have just realized that
the body is slightly twisted in space - not perfectly aligned to the
global reference system as would be indicated in the model. This
makes sense, as when the Vicon mocap cameras are calibrated and the
wheelchair subsequently placed for analysis, it would be nearly
impossible to align the subject/wheelchair up exactly as the room
has been calibrated (with regards to the coordinate systems). So,
for example, when I am trying to drive the pelvis based on
coordinates relative to the hubs (whose axes are not aligned with
the global coordinate axes), I have typed in the following:
>
> AnyKinLinear PelvisPos = {
> AnyFixedRefFrame &Ground = …EnvironmentModel.GlobalRef;
> AnyRefNode &Tuber =
Main.MyArm.HumanModel.Trunk.SegmentsLumbar.PelvisSeg.TuberIschiadicum
Center;
> };
>
> AnyKinRotational PelvisRot = {
> AnyFixedRefFrame &Ground = …EnvironmentModel.GlobalRef;
> AnySeg &Pelvis =
Main.MyArm.HumanModel.Trunk.SegmentsLumbar.PelvisSeg;
> Type = RotAxesAngles;
> };
>
> AnyReacForce PelvisReac = {
> AnyKinRotational &ref = .PelvisRot;
> };
>
> AnyKinEqSimpleDriver SeatHeight = {
> AnyKinLinear &PelvisRot = .PelvisPos;
> MeasureOrganizer = {2};
> DriverPos = {
> 0.0125307 //This is because the subject is not evenly
situated in the chair - they are shifted slightly to the right
> };
>
> DriverVel = {0};
> Reaction.Type = {1};
> };
>
> And the fact that I have the following as well:
>
> AnyKinRotational ThoraxRot = {
> AnySeg &Thorax= .Thorax;
> AnyFixedRefFrame &Ground = …EnvironmentModel.GlobalRef;
> Type = RotAxesAngles;
> };
>
>
> Won’t these commands be a problem if the body is slightly twisted
in space? Maybe I am a little confused, but I think I have to
rearrange the global axes to align with the hubs axes if I want to
drive my markers with respect to the hub. Am I correct in thinking
this? If so, do you have any suggestions as to how to go about
this, or if I am incorrect, can you point me in the right direction?
>
> Thank you again for your time,
> Sarah
>
>
> -----Original Message-----
>
> > Date: Wed Jun 27 08:18:42 EDT 2007
> > From: “AnyBody Support” <support@…>
> > Subject: [AnyScript] Re: Increasing DOF in the wheelchair model -
continued
> > To: anyscript@yahoogroups.com
> >
> >
> >
> > Hi Sarah
> >
> > The first error you get means that this muscle is overstretched
the
> > quick fix to this is to switch to the simple muscle model, by
> > shifting the include statement, this i would recommend at this
stage
> > of the model. Shifting the muscle model may help on the
recruiment
> > problems, too.
> >
> > The second error is a wrapping error; the fix is usually to
increase
> > the property SPLine.StringMesh for example by 10 or 20.
> >
> >
> > I have tried to run your model but i miss some markers you have
> > defined in the BRep i think.
> >
> > In the MarkerPosOnBody.any file you define the some new markers
by
> > creating nodes inside markernodes already existing
> >
> > So the lines
> >
> > // AnyFolder &C7 =
> > Main.MyArm.HumanModel.Trunk.SegmentsThorax.ThoraxSeg.C7Marker;
> > // C7={
> > // AnyRefNode C7 = {
> > // sRel = {0,0,0};//{-0.06,0.005,0};//{-0.03,-.028,0.00};
> > // AnyDrawNode drw={
> > // ScaleXYZ={0.01,.01,.01};
> > // RGB={0,0,1};
> > // };
> > // };
> > // };
> >
> > Will create a new node “C7” inside the node named “C7Marker” i
do
> > not really understand the purpose of this.
> >
> > I think it would be better to do the following
> >
> > AnyFolder &thorax =
> > Main.MyArm.HumanModel.Trunk.SegmentsThorax.ThoraxSeg;
> > // thorax={
> > // AnyRefNode C7Marker = {
> > // sRel = x?, y?, z?
> > // AnyDrawNode drw={
> > // ScaleXYZ={0.01,.01,.01};
> > // RGB={0,0,1};
> > // };
> > // };
> > // };
> >
> > and then at the same time remove the markers from the bRep.
> >
> > This will allow me to run you model without changeing the BRep.
> >
> >
> > Best regards
> > Søren
> >
> >
> > — In anyscript@yahoogroups.com, “Sarah R. Sullivan”
<sarsulli@>
> > wrote:
> > >
> > > Thank you for all your help, Soren! I have slowly made
progress
> > > increasing the degrees of freedom in the model by driving the
> > pelvis
> > > and trunk positions with mocap data, however I still have a few
> > > questions. First off, let me tell you what I have done so far:
> > >
> > > - Using trochanter markers, I am able to drive the pelvis in
> > the x-
> > > (anterior/posterior), y- (inferior/superior), and z-
> > (medial/lateral)
> > > directions. I drive the right trochanter in the x- and y-
> > directions,
> > > and the left trochanter in the y- and z- directions. In lieu
of
> > these
> > > drivers, I have taken out the old “SeatHeight” driver.
> > > - Using the shoulder markers (lateral border of the AC), I am
> > driving
> > > the x- direction (sterno-clavicular protraction/retraction)
with
> > mocap
> > > data. To do this I took out the corresponding driver in the
> > > “SCDriverRight” and “SCDriverLeft.” I still however, am
unable to
> > > successfully drive the elevation/depression of the shoulders,
> > which I
> > > eventually want to be able to do.
> > > - I am driving the sternum in the x- and z- directions, the C7
> > marker
> > > in the z- direction, and the T3 marker in the y- direction. I
have
> > > removed the “SeatBackDriver,” and the
PelvisThoraxLateralBending
> > and
> > > PelvisThoraxRotation from the “PostureDriver” (I still have the
> > > PelvisThoraxExtension being driven by the “PostureDriver”).
> > >
> > > I can get the model to compile, and SetInitialConditions,
however
> > the
> > > individual is inaccurately tilted to the left (see the two
images I
> > > have uploaded showing the mocap data at pushrim contact for
this
> > > particular individual). When I run the KinematicAnalysis I
get the
> > > following warning at frame 46 (out of 58):
> > >
> > > WARNING(OBJ.MCH.MUS2) :
> > > BRep\Aalborg\Arm3D\Muscle-parameters-shoulder.any(1310) :
> > > ‘trapezius_scapular_part_4’ : Muscle without strength :
The
> > muscle
> > > has been stretched too much
> > >
> > > Followed by the error in frame 55:
> > >
> > > ERROR : BRep\Aalborg\Arm3D\Muscle.any(36) :
> > > biceps_brachii_caput_breve : Unexpected exception in the
> > library
> > > OOSol : OOSol exception : General factorization exception :
> > Negative
> > > or zero pivot
> > >
> > > At which point the analysis ends.
> > >
> > > I would still like to completely free up the posture driver
and
> > have
> > > something drive the thorax flexion/extension (I am still
unsure
> > as
> > > to how to potentially re-adjust the STN, C7, and T3 markers to
do
> > > this). And I want to allow elevation/depression of the
shoulders
> > by
> > > taking out the driver that holds this constant (in the
> > SCDriverRight
> > > and –Left), by using the shoulder markers to do this.
> > >
> > > I have uploaded the current model (SarahArmModel - Muscles -
> > > IncreasingDOF_6-22-07.zip), in which there are the
aforementioned
> > > pictures (PASaggital.jpeg and PAFrontal.bmp) for reference.
If you
> > > could take a look at it and give me any suggestions you may
have, I
> > > would really appreciate it!
> > >
> > > As always, thank you for your help,
> > > Sarah
> > >
> > > PS – At this point, I’m not too concerned because I think when
the
> > > kinematics are correct it may help, but I am currently unable
to
> > get
> > > the InverseDynamicAnalysis to run at all due to the following
> > problem:
> > >
> > > ERROR(OBJ1) : ArmModel.main.any(61) : ‘MyStudy’ : Muscle
> > > recruitment analysis failed, simplex solver reports that
solution
> > does
> > > not satisfy all constraints.
> > >
> > > Like I said, I think that with correct kinematics this may
change,
> > but
> > > I figured I would let you know about my problems with this
> > analysis.
> > >
> >
> >
>