sift:tutorials
Differences
This shows you the differences between two versions of the page.
sift:tutorials [2025/08/19 13:53] – created wikisysop | sift:tutorials [2025/08/19 13:55] (current) – removed wikisysop | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ======Effects of Fatigue During Basketball Free Throws Using SPM and ANOVA====== | ||
- | ====Abstract==== | ||
- | This tutorial demonstrates how to use **Visual3D** and **Sift** as tools to examine the effects of fatigue on lower body joint kinematics, specifically at the ankle, knee, and hip during basketball free throws. Using MLSE's markerless motion capture data, joint angles were computed across the trials to assess how movement changed as fatigue develops. Statistical analysis was done using SPM and ANOVA, the results revealed a consistent decrease in hip and knee flexion, along with reduced ankle dorsiflexion as the trials progressed. These changes suggest a diminished contribution from the lower body during the shooting motion under fatigue. Further analysis could explore potential compensations in upper-body joints. Follow along below to learn how this dataset was processed, visualized, and analyzed using **Visual3D** and **Sift**.\\ | ||
- | |||
- | **What are the effects of fatigue on hip, knee, and ankle joint kinematics during made basketball free throws across 125 consecutive attempts?** | ||
- | |||
- | ====Dataset & Relevant Links==== | ||
- | This tutorial will be using the public dataset made available by [[https:// | ||
- | |||
- | Dataset is available at the following link: | ||
- | |||
- | In github navigate to **basketball/ | ||
- | {{: | ||
- | |||
- | The trials in the dataset are organized as JSON files (" | ||
- | |||
- | {{: | ||
- | |||
- | The **XYZ Cardan Sequence coordinate system** was used to capture the complexity of the free throw motion. Using this sequence aids in not only seeing the joint angles change throughout the free throw motion but the ball trajectory as well. An in depth explanation about the Cardan Sequence can be seen here, [[https:// | ||
- | ====Processing Data in Visual3D==== | ||
- | Below are the steps required to build and execute the single pipeline needed to process the raw dataset. The final pipeline is rather lengthy, it can be downloaded here if needed, [[https:// | ||
- | |||
- | To follow along, navigate to {{: | ||
- | |||
- | ===Converting Between .json and .cmz=== | ||
- | |||
- | **1.** Open up the Pipeline Workshop\\ | ||
- | **2.** Select ' | ||
- | |||
- | Set_Pipeline_Parameter_To_Folder_Path | ||
- | / | ||
- | / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ; | ||
- | |||
- | **3.** Select ' | ||
- | |||
- | Set_Pipeline_Parameter_To_List_Of_Files | ||
- | / | ||
- | /FOLDER= ::FOLDER | ||
- | ! / | ||
- | / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ; | ||
- | |||
- | **4.** Before running this section, create a folder named " | ||
- | |||
- | For_Each | ||
- | / | ||
- | / | ||
- | /ITEMS= ::FILES | ||
- | ; | ||
- | | ||
- | File_New | ||
- | ; | ||
- | | ||
- | File_Open | ||
- | /FILE_NAME= ::INDEX | ||
- | ! /FILE_PATH= | ||
- | ! / | ||
- | ! /SUFFIX= | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ; | ||
- | | ||
- | File_Save_As | ||
- | / | ||
- | / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ; | ||
- | | ||
- | End_For_Each | ||
- | / | ||
- | ; | ||
- | |||
- | This pipeline itself will convert all the .json files to workspaces(.cmz) and can be run individually. But for consistency, | ||
- | |||
- | ===Assigning Tags=== | ||
- | |||
- | In this dataset, the primary variables analyzed are whether the subject made or missed the shot and the quarter of the session in which the free throw trial occurred. Tags are assigned to each trial for easier processing in **Sift**. | ||
- | |||
- | Many of the tag commands are repeated in the pipeline, so each command will be shown here once and the order of the pipeline will be provided so that it can be built manually. If you are having difficulty recreating the pipeline, the complete pipeline is given at the beginning of this section of the tutorial. | ||
- | |||
- | **1.** ' | ||
- | |||
- | Select_Active_File | ||
- | / | ||
- | ! /QUERY= | ||
- | ! / | ||
- | ; | ||
- | |||
- | **2.** To assign a tag the ' | ||
- | |||
- | Assign_Tags_To_Files | ||
- | / | ||
- | /QUERY= PARAMETERS:: | ||
- | ! change this to " | ||
- | /TAGS= missed | ||
- | ! change the tag to ' | ||
- | ; | ||
- | |||
- | **3.**This subject completed 125 trials in total. To address the primary research question related to fatigue, the trials are divided into four sections (quarters), allowing each quarter to be analyzed independently and compared over time. Conditional statements are used to mark which quarter the trial took place. The quarters are: Q1 (Trial 1-31), Q2 (Trial 32-63), Q3 (Trial 64-94), Q4 (Trial 95-125).\\ | ||
- | | ||
- | |||
- | Conditional_Statement | ||
- | / | ||
- | / | ||
- | ! / | ||
- | ; | ||
- | | ||
- | Assign_Tags_To_Files | ||
- | / | ||
- | !/QUERY= | ||
- | /TAGS= Q1 | ||
- | ; | ||
- | | ||
- | Conditional_Statement_End | ||
- | / | ||
- | ; | ||
- | |||
- | | ||
- | |||
- | Conditional_Statement | ||
- | / | ||
- | / | ||
- | ! / | ||
- | ; | ||
- | | ||
- | Conditional_Statement | ||
- | / | ||
- | / | ||
- | ! / | ||
- | ; | ||
- | | ||
- | Assign_Tags_To_Files | ||
- | / | ||
- | ! /QUERY= | ||
- | /TAGS= Q2 | ||
- | ; | ||
- | | ||
- | Conditional_Statement_End | ||
- | / | ||
- | ; | ||
- | Conditional_Statement_End | ||
- | / | ||
- | ; | ||
- | |||
- | **4.** The order of the pipeline in its current state: | ||
- | * Set_Pipeline_Parameter_To_Folder_Path | ||
- | * Set_Pipeline_Parameter_To_List_Of_Files | ||
- | * For_Each | ||
- | * File_New | ||
- | * File_Open | ||
- | * Select_Active_File | ||
- | * Assign_Tags_To_Files | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement | ||
- | * Conditional_Statement | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement | ||
- | * Conditional_Statement | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement_End | ||
- | * File_Save_As | ||
- | * End_For_Each | ||
- | |||
- | ===Event Tags=== | ||
- | |||
- | In biomechanical data analysis it is necessary to have defined events such as ' | ||
- | |||
- | {{: | ||
- | |||
- | **1.** Add ' | ||
- | |||
- | Event_Global_Minimum | ||
- | ! name the event | ||
- | / | ||
- | / | ||
- | ! right hand | ||
- | / | ||
- | ! center of gravity | ||
- | / | ||
- | ! z-component | ||
- | / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! /THRESHOLD= | ||
- | ; | ||
- | |||
- | **2.** Add ' | ||
- | |||
- | Event_Global_Maximum | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! /THRESHOLD= | ||
- | ; | ||
- | |||
- | **3.** This step isn't required, but for interest, an event between can be added that will put an event at the midpoint between the start and end events. | ||
- | |||
- | Event_Between | ||
- | / | ||
- | ! / | ||
- | / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ; | ||
- | |||
- | **4.** All 3 of these event commands can be added in order after the last ' | ||
- | |||
- | Visualization of the **START** and **END** events can be seen below:\\ | ||
- | ^**START**^**END**^ | ||
- | | {{: | ||
- | |||
- | |||
- | ===Computing Joint Angles=== | ||
- | |||
- | Now that all the tags and events are created, the final step is to calculate kinematic variables and specifically in this case, joint angles. The joint angles for the lower limb model will be calculated (ankle, knee, and hip joint).\\ | ||
- | |||
- | **1.** Select **Model Based Data Computation** add " | ||
- | Compute_Model_Based_Data | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ! /AXIS1=X | ||
- | ! /AXIS2=Y | ||
- | ! /AXIS3=Z | ||
- | ! / | ||
- | ! / | ||
- | ! / | ||
- | ; | ||
- | |||
- | Below is a table with all the " | ||
- | |||
- | ^ Compute_Model_Based_Data | ||
- | | Right Ankle Angle | RFT | RSK | | ||
- | | Left Ankle Angle | LFT| LSK| | ||
- | | Right Hip Angle | RTH | RPV| | ||
- | | Left Hip Angle | LTH| RPV| | ||
- | | Right Knee Angle | RSK | RTH| | ||
- | | Left Knee Angle | LSK| LTH| | ||
- | |||
- | |||
- | ===Completed Pipleline=== | ||
- | The pipeline should now have the following components: | ||
- | * Set_Pipeline_Parameter_To_Folder_Path | ||
- | * Set_Pipeline_Parameter_To_List_Of_Files | ||
- | * For_Each | ||
- | * File_New | ||
- | * File_Open | ||
- | * Select_Active_File | ||
- | * Assign_Tags_To_Files | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement | ||
- | * Conditional_Statement | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement | ||
- | * Conditional_Statement | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement_End | ||
- | * Conditional_Statement | ||
- | * Assign_Tags_To_Files | ||
- | * Conditional_Statement_End | ||
- | * Event_Global_Minimum | ||
- | * Event_Global_Maximum | ||
- | * Compute_Model_Based_Data | ||
- | * Compute_Model_Based_Data | ||
- | * Compute_Model_Based_Data | ||
- | * Compute_Model_Based_Data | ||
- | * Compute_Model_Based_Data | ||
- | * Compute_Model_Based_Data | ||
- | * File_Save_As | ||
- | * End_For_Each | ||
- | |||
- | ====Analysis & Visualization in Sift==== | ||
- | Open a blank workspace in **Sift**, the processed __cmz files__ created from **Visual3D** will be used to analyze the ankle, knee, and hip joint angles to see the effects of fatigue. **Sift** will produce visualizations to be able to better understand the results. | ||
- | |||
- | ===Load " | ||
- | To load the processed files into sift, select {{: | ||
- | |||
- | Since there are numerous queries needed, the following file can be used (ensure the file is saved as a **.q3d file** - can download as a txt file and rename to .q3d), [[https:// | ||
- | |||
- | If completing manually, when the files are loaded navigate to the Explore tab on the left and select the Query Builder{{: | ||
- | |||
- | |||
- | The analysis requires the ankle, knee, and hip angles in all directions (X,Y,Z) and separated into four groups based on fatigue levels (Q1, Q2, Q3, Q4) made into separate queries. Below is an example on how to manually create one of these queries. \\ | ||
- | **1.** Click the plus sign beside " | ||
- | **2.** Name the condition **" | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | |||
- | After all queries are made, there should be 9 queries for each quarter (36 total). For example:\\ | ||
- | -Q1 Ankle Angle X\\ | ||
- | -Q1 Ankle Angle Y\\ | ||
- | -Q1 Ankle Angle Z\\ | ||
- | -Q1 Knee Angle X\\ | ||
- | -Q1 Knee Angle Y\\ | ||
- | -Q1 Knee Angle Z\\ | ||
- | -Q1 Hip Angle X\\ | ||
- | -Q1 Hip Angle Y\\ | ||
- | -Q1 Hip Angle Z\\ | ||
- | |||
- | ===Registering the Curves=== | ||
- | In order to produce accurate results, the curves must be registered to a global or local maximum or minimum event. This will show a better representation of amplitude variation. To learn more about curve registration, | ||
- | |||
- | Since the most variability in joint angles occurs in the x-direction (flexion or compression), | ||
- | |||
- | The following curves need to be registered: | ||
- | -**Q1, Q2, Q3, Q4 Ankle Angle X**\\ | ||
- | -**Q1, Q2, Q3, Q4 Knee Angle X**\\ | ||
- | -**Q1, Q2, Q3, Q4 Hip Angle X**\\ | ||
- | |||
- | Select **Register Curves** at the bottom left of the page, to register a global maximum or minimum follow:\\ | ||
- | {{: | ||
- | |||
- | Select **Register Curves**, to register a local maximum or minimum follow:\\ | ||
- | {{: | ||
- | |||
- | Below is a table with each group and the associated registration type.\\ | ||
- | |||
- | ^ Groups | ||
- | | Q1, Q2, Q3, Q4 Ankle Angle X | Global Max | ||
- | | Q1, Q2, Q3, Q4 Knee Angle X | Global Min | | ||
- | | Q1, Q2, Q3, Q4 Hip Angle X | Local Max between 20-40 | | ||
- | |||
- | |||
- | |||
- | ===Plotting in Sift=== | ||
- | To view the effects of fatigue, Q1 and Q4 data of the ankle, knee, and hip angles will be plotted. \\ | ||
- | *In the **Explore** tab, right click on both **Q1AnkleAngleX_Registered** and **Q4AnkleAngleX_Registered** in the __Plotting Controls__. | ||
- | *__Select All Workspaces__ above the Workspaces box. | ||
- | *In the __Plotting Controls__ tab, select **Plot Group Mean** and **Plot Group Dispersion.** | ||
- | |||
- | Repeat this process for the knee and hip. To change the style of the plot, refer to [[sift: | ||
- | |||
- | The plots should look similar to below:\\ | ||
- | |||
- | ^ Ankle ^ Knee ^ Hip ^ | ||
- | | {{: | ||
- | |||
- | ===Statistical Parametric Mapping (SPM) & ANOVA Analysis=== | ||
- | **SPM** is a statistical analysis method that will show if there are significant statistical differences in the processed dataset. To learn more about SPM reference, [[sift: | ||
- | 1. Control-right click on the two registered groups being analyzed, navigate to the **Analyze** tab and select the **Mapping** tab at the bottom of the **INFO** box and select **Crete GLM**. Follow the below image for the ankle, knee, and hip.\\ | ||
- | {{: | ||
- | 2. Navigate to the **Statistics** tab at the bottom of the **INFO** box and select **Compute SPM** - follow the image below.\\ | ||
- | {{: | ||
- | |||
- | The above steps can be followed for the ankle, knee, and hip to see if there are statistically significant differences in each joint as fatigue increases. | ||
- | |||
- | A one way ANOVA test can be conducted on all four sections of free throws (Q1, Q2, Q3, Q4). The ANOVA test compares the means of the four groups to determine if there is a statistically significant difference between them. In order to do this, follow the above SPM steps but instead of selecting **Two Sample T-Test**, select ** One-Way ANOVA**. Compute the SPM using the ANOVA GLM. | ||
- | |||
- | ====Results==== | ||
- | After analyzing the motion capture data, clear changes in lower-body joint kinematics were observed across all trials. Notably, shooting performance improved from Q1 to Q4, with 17 out of 31 shots made in Q1 and 23 out of 31 shots made in Q4. The null hypothesis, mean joint angles remain consistent before and after fatigue was rejected following statistical analysis. Specifically, | ||
- | |||
- | ==SPM Results== | ||
- | The associated t-values for each SPM result for the ankle, knee, and hip respectively are below:\\ | ||
- | | ^ SPM t-values | ||
- | ^ Ankle | 2.72 | 15% - 30% | | ||
- | ^ Knee | 2.83 | 12% - 80% | | ||
- | ^ Hip | 2.83 | 12% - 75% | | ||
- | |||
- | |||
- | The ankle SPM showed a significant reduction in ankle dorsiflexion between Q1 and Q4, this can be seen in the " | ||
- | |||
- | Similarly, the knee and hip both showed significant reduction in flexion as the trials progressed. Both have t-values of **2.83** and occurred between **12-80%** for the knee and **12-75%** for the hip. Since the clusters were continuous and large this suggests a consistent change in lower body mechanics over majority of the free throw motion as fatigue progressed.\\ | ||
- | |||
- | To better visualize the section of the movement where there is a significant difference in flexion, reference the yellow line on the graphs in the second row below.\\ | ||
- | |||
- | ^ Ankle SPM ^ Knee SPM ^ Hip SPM ^ | ||
- | | {{: | ||
- | | {{: | ||
- | |||
- | |||
- | ==ANOVA== | ||
- | The ANOVA test results can be seen below with F values for the ankle, knee, and hip.\\ | ||
- | |||
- | ^ Ankle ANOVA F-value | ||
- | | 4.76 | 4.97 | 4.92 | | ||
- | |||
- | A larger F-value indicates that the group means have more variance relative to variability within each group. These results indicate that all three joints showed significant changes in the movement pattern over time with a consistent reduction in flexion observed in later trials. To further understand the concept of an ANOVA test, reference [[https:// | ||
- | |||
- | ^ Ankle ANOVA ^ Knee ANOVA ^ Hip ANOVA | ||
- | | {{: | ||
- | |||
- | ====Conclusions==== | ||
- | This tutorial demonstrated that fatigue significantly impacts lower body joint kinematics during repeated basketball free throw attempts in one session. Motion capture data, courtesy of MLSE, revealed a consistent reduction in ankle, hip, and knee flexion as fatigue developed. SPM and ANOVA tests were used to identify that there is significant clusters of reduced joint angles across the motion for the hip and knee, and a smaller reduction seen in the ankle. The ANOVA test confirmed the SPM test results.\\ | ||
- | |||
- | These results suggests the importance of lower-body endurance in being able to maintain consistent free throw mechanics. Further research could investigate if upper body joints compensate for the reduction in flexion in the lower body. This could aid in the creation of strategies to reduce fatigue-related performance decline. | ||
- | |||
- | |||
- | ====References==== | ||
- | [1] Lees A, Barton G, Robinson M. The influence of Cardan rotation sequence on angular orientation data for the lower limb in the soccer kick. J Sports Sci. 2010 Feb; | ||
sift/tutorials.1755611598.txt.gz · Last modified: 2025/08/19 13:53 by wikisysop