--- a +++ b/Docs/Scaling/lesson3.md @@ -0,0 +1,162 @@ +# Lesson 3: Scaling using segmental scaling vectors + +This tutorial presumes that you have completed {doc}`Scaling tutorial +Lesson 1: Joint to joint scaling methods <lesson1>` and {doc}`Scaling tutorial +Lesson 2: Scaling based on External Body Measurements <lesson2>`. It +covered all the methods based on distance measurements and estimations. + +This lesson introduces the last scaling method, which differs from the previous +ones by the input parameterse and, therefore, allows another set of +solutions when it comes to anthropometric scaling + +## Scaling XYZ + +The scaling laws discussed in the previous measurements rely on standard +measurements and distance estimates such as joint-to-joint distances or +predefined external measurements, e.g. manual palpations and so on. This is a +good approach, when a corresponding measurement study can be designed in +advance, or a particular measurement protocol can be adjusted to fit the model +requirements. However, sometimes this is not feasible and the modeller needs to +rely on available data, such as an anthopometric database, or data coming from +an old study with measurements different to the standard ones. In this case +individual segmental scaling can be constructed by establishing a correspondence +between available data and virtual measurements on the model. Let us consider +the following example: For `_SCALING_UNIFORM_` the head is scaled by a single +factor (`HeadHeight`), and in case of the `_SCALING_LENGTHMASSFAT_` it would +also depend on the corresponding mass of the head segment. But we could actually +know even more accurate dimensions of our subject's head. And these measurements +should be used by the model. Let's say that our subject corresponds to the 50th +percentile male and the measurements will be taken from DIN 1986 (Deutsches +Institut fur Normung) anthropometric dataset. + +| HEAD HEIGHT, mm | HEAD LENGTH, mm | HEAD BREADTH, mm | +| --------------- | --------------- | ---------------- | +| 228 | 193 | 156 | + +The head height represent the vertical size of the head, measured from the +chin to the top of the head, head length represents the depth of the skull +from the most anterior point on the forehead to the most posterior point on +the back of the head, and, finally, head breadth correspond to the width of +the head. + +We have prepared some code to visualize points used to measure these distances. +As well as that a couple of measures were added to see the result of scaling. +Please enable this code by uncommenting the following code: + +```AnyScriptDoc +// Head scaling visualization and measurements +§#define HEAD_SCALING_XYZ§ +#ifdef HEAD_SCALING_XYZ + #include "Model\HeadScalingXYZ.any" +#endif +``` + +```{image} _static/lesson3/HeadMarkersFrontView.jpg +:width: 49% +``` + +```{image} _static/lesson3/HeadMarkersLateralView.jpg +:width: 49% +``` + +Let us use the last scaling law: `_SCALING_XYZ_`. For this purpose please +switch it on like shown below: + +```AnyScriptDoc +// Scaling laws using joint to joint measures +// #define BM_SCALING _SCALING_UNIFORM_ +// #define BM_SCALING _SCALING_LENGTHMASS_ +// #define BM_SCALING _SCALING_LENGTHMASSFAT_ +§ #define BM_SCALING _SCALING_XYZ_§ +``` + +Let us inspect what segment dimension are available for this scaling law. Go to +`Main.HumanModel.Anthropometrics.SegmentDimensions` in the model tree: + +```{image} _static/lesson3/XYZ_segment_dimensions.jpg +``` + +We could see that the first section containing overall body parameters and the +SegmentMasses folder are identical to any other scaling law. But instead of only +having a folder called SegmentDimensions, we now have another called +SegmentScaleFactors. Looking at the content it is clear that this folder +contains invidual scaling factors along main axes. By default all values are set +to be 1, meaning that the cadaveric data will not scale and the law will behave +similarly to the `_SCALING_NONE_`. + +Let us define the head scaling factors as expected lengths divided by unscaled +head dimensions. In HeadScalingXYZ.any we have already prepared the +computation of these distances and we just need to check these values in the Model +Tree: + +:::{tip} +Right-click on the object and use "Locate in Model Tree" to find it in the Model Tree. +::: + +```{image} _static/lesson3/HeadDimensionsModelTree.jpg +``` + +Now that we know original and desired dimensions the scale factors can be defined as +the following block of code inside the `AnyManXYZ.any`. Please apply this changes and +reload the model: + +```AnyScriptDoc +Main.HumanModel.Anthropometrics.SegmentScaleFactors.Head = { + §// Standard unscaled values + AnyVar HEAD_BREADTH = 0.19; + AnyVar HEAD_LENGTH = 0.239; + AnyVar HEAD_HEIGHT = 0.26; + + // Scale factor computation + LengthScale = 0.228/HEAD_HEIGHT;///< 228mm, DIN 1986 + DepthScale = 0.193/HEAD_LENGTH; ///< 193mm, DIN 1986 + WidthScale = 0.156/HEAD_BREADTH;///< 156mm, DIN 1986 § +}; +``` + +```{image} _static/lesson3/HeadMarkersFrontView.jpg +:width: 49% +``` + +```{image} _static/lesson3/HeadMarkersAppliedFrontView.jpg +:width: 49% +``` + +We have succesfully personalized our model to have a head that corresponds to +the German 50th percentile man. We can see that it is slightly smaller than +the default one coming with model. However, we still see that the body does not +match the head size. The same anthropometric dataset suggests that the height +of the 50th percentile man should be 173.3mm. We could mimic `_SCALING_UNIFORM_` +by defining a common scaling factor and applying it to all dimensions like this: + +```AnyScriptDoc +Main.HumanModel.Anthropometrics.BodyMass = 75 ; +Main.HumanModel.Anthropometrics.BodyHeight = 180 /100; + +§#define STATURE_SCALE_FACTOR 1.733/1.75§ + +... + +Main.HumanModel.Anthropometrics.SegmentScaleFactors.Pelvis = { + LengthScale = §STATURE_SCALE_FACTOR§; + DepthScale = §STATURE_SCALE_FACTOR§; + WidthScale = §STATURE_SCALE_FACTOR§; +}; +Main.HumanModel.Anthropometrics.SegmentScaleFactors.Thorax = { + LengthScale = §STATURE_SCALE_FACTOR§; + DepthScale = §STATURE_SCALE_FACTOR§; + WidthScale = §STATURE_SCALE_FACTOR§; +}; + +... +``` + +```{image} _static/lesson3/ScalingXYZFinal.jpg +``` + +By applying these changes we complete this tutorial. Our model looks more natural +and corresponds to the 50th percentile German male as suggested by DIN in 1986. + +If you want to learn about more advanced patient specific scaling, take a look at the +AnyBody tutorials. The tutorial on Scaling covers how to do patient-specific scaling based on +geometry data from MRI and CT scans.